Dir () дает какую-либо гарантию порядка возврата файлов? - PullRequest
13 голосов
/ 26 ноября 2010

Я пытаюсь очистить существующий код

Sheets("Control").Select
MyDir = Cells(2, 1)
CopySheet = Cells(6, 2)
MyFileName = Dir(MyDir & "wp*.xls")

' when the loop breaks, we know that any subsequent call to Dir implies
' that the file need to be added to the list
While MyFileName <> LastFileName
    MyFileName = Dir
Wend

MyFileName = Dir

While MyFileName <> ""
    Cells(LastRow + 1, 1) = MyFileName
    LastRow = LastRow + 1
    MyFileName = Dir
Wend

Мой вопрос касается того, как Dir возвращает результаты и есть ли какие-либо гарантии в отношении порядка результатов.При использовании Dir в цикле, как указано выше, код подразумевает, что результирующие вызовы Dir упорядочены по имени.

Если Dir не гарантирует этого, это ошибка, которую необходимо исправить.Вопрос, дает ли Dir () какую-либо гарантию порядка, в котором файлы возвращаются, или это неявно?

Решение

Основываясь на ответе @ Frederic, это решение, которое я придумал,

Использование этого алгоритма быстрой сортировки вместе и функции, которая возвращает все файлы в папке ...

Dim allFiles As Variant
allFiles = GetFileList(MyDir & "wp*.xls")
If IsArray(allFiles) Then
    Call QuickSort(allFiles, LBound(allFiles), UBound(allFiles))
End If

Dim x As Integer
Dim lstFile As String
x = 1

' still need to loop through results to get lastFile
While lstFile <> LastFileName 
    lstFile = allFiles(x)
    x = x + 1
Wend

For i = x To UBound(allFiles)
    MyFileName = allFiles(i)
    Cells(LastRow + 1, 1) = MyFileName
    LastRow = LastRow + 1
Next i

1 Ответ

8 голосов
/ 26 ноября 2010

Нет гарантии, что Dir() вернет файлы в любом конкретном порядке.В документации MS Access VBA даже сказано:

Подсказка Поскольку имена файлов извлекаются не в определенном порядке, вы можете сохранить возвращенные имена файлов вarray, а затем сортируйте массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...