Эффективно перечислить все подкаталоги в каталоге - PullRequest
6 голосов
/ 03 сентября 2011

Пожалуйста, смотрите редактирование с советом, принятым до сих пор ...

Я пытаюсь перечислить все каталоги (папки) в данном каталоге, используя WinAPI & C ++.

Сейчас мой алгоритм медленный и неэффективный:
- Используйте FindFirstFileEx (), чтобы открыть папку, которую я ищу
- Затем я смотрю на каждый файл в каталоге (используя FindNextFile ()); если это файл каталога, то я сохраняю его абсолютный путь в векторе, если это просто файл, я ничего не делаю.

Это кажется крайне неэффективным, потому что я просматриваю каждый файл в каталоге.

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

EDIT: Поэтому после получения совета я искал, используя FindExSearchLimitToDirectories, но для меня он все равно распечатывает все файлы (.txt и т. Д.), А не только папки. Я что-то не так делаю?

WIN32_FIND_DATA dirData;
HANDLE dir = FindFirstFileEx( "c:/users/soribo/desktop\\*", FindExInfoStandard, &dirData, 
                              FindExSearchLimitToDirectories, NULL, 0 );

while ( FindNextFile( dir, &dirData ) != 0 )
{
    printf( "FileName: %s\n", dirData.cFileName );
}

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Чтобы увидеть повышение производительности, должна быть поддержка на уровне файловой системы.Если этого не существует, система должна перечислить каждый отдельный объект в каталоге.

В принципе, вы можете использовать FindFirstFileEx, указывая флаг FindExSearchLimitToDirectories.Однако в документации говорится (выделено мое):

Это рекомендательный флаг.Если файловая система поддерживает фильтрацию каталогов, функция ищет файл, который соответствует указанному имени и также является каталогом.Если файловая система не поддерживает фильтрацию каталогов, этот флаг игнорируется.

Если требуется фильтрация каталогов, этот флаг можно использовать во всех файловых системах, но поскольку он является рекомендательным и влияет только на файловые системы. приложение должно проверить данные атрибута файла, хранящиеся в параметре lpFindFileData функции FindFirstFileEx, чтобы определить, вернула ли функция дескриптор каталога .

ОднакоСудя по тому, что я могу сказать, и информации немного, флаг FindExSearchLimitToDirectories не широко поддерживается в настольных файловых системах.

Лучше всего использовать FindFirstFileEx с FindExSearchLimitToDirectories.Вы все равно должны выполнить свою собственную фильтрацию на случай, если вы встретите файловую систему, которая не поддерживает фильтрацию каталогов на уровне файловой системы.Если вам повезет и вы столкнетесь с файловой системой, которая ее поддерживает, вы получите выигрыш в производительности.

1 голос
/ 03 сентября 2011

Если вы используете FindFirstFileEx, тогда вы сможете указать параметр _FINDEX_SEARCH_OPS::FindExSearchLimitToDirectories (который будет использоваться как параметр fSearchOp в FindFirstFileEx) для ограничения первого поиска (и любые последующие FindNextFile()) обращения к каталогам.

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