2010-07-04 2 views
13

Как получить все файлы в заданном каталоге с помощью C++ в Windows?Файлы в каталоге в C++

Примечание:
Я нашел методы, которые используют dirent.h, но мне нужно более стандартный способ ...

Благодарности

+2

На самом деле функции в dirent.h являются более стандартными (POSIX). – 2010-07-04 21:12:19

+3

Но файл не включен в VC++ 2008 – qwe

+1

@Neil: POSIX не входит в стандартную библиотеку и не поддерживается самой используемой компилятором C/C++ (MSVC) самой используемой операционной системы (Windows). – Wizard79

ответ

5

Вы должны использовать функцию FindFirstFile (documented here). Это стандартный (и предпочтительный) способ в Windows, однако он не переносится. Выбранный заголовок dirent.h содержит определение функций standard POSIX.

Для полного кода посмотреть на этом примере: Listing the Files in a Directory

29

Использование FindFirstFile и связанные с ними функции. Пример:

HANDLE hFind; 
WIN32_FIND_DATA data; 

hFind = FindFirstFile("c:\\*.*", &data); 
if (hFind != INVALID_HANDLE_VALUE) { 
    do { 
    printf("%s\n", data.cFileName); 
    } while (FindNextFile(hFind, &data)); 
    FindClose(hFind); 
} 
+0

-1 для использования устаревшего 8-битного API. – Philipp

+1

@Philipp: это устаревший * 8-битный * API ??? – Wizard79

+0

@ Lorenzo: тот, который использовался casablanca, называется «ANSI» в библиотеке MSDN (термин «8-бит» технически корректен, но, по-видимому, используется мной исключительно). Он включен только для совместимости с Windows 9x. Собственный API - UTF-16. Чтобы использовать его, всюду определяйте 'UNICODE' и заменяйте 8-битные функции, такие как' printf', либо с помощью общих макросов ('_tprintf'), либо с помощью функции UTF-16 (' _wprintf'), и используйте «широкие» строковые константы с ' L' или макросом 'TEXT'. Посмотрите свое собственное сообщение для лучшего примера (все еще без 'UNICODE', потому что это должно быть определено с помощью переключателя компилятора). – Philipp

10

Что касается библиотеки boost: файловой системы. Boost.org

+4

+1 для Boost. Возможно, вы захотите установить ссылку на документы файловой системы: http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/index.htm –

+0

Это вряд ли «стандартный способ» в Windows ... – Wizard79

+1

Это зависит от определения слова «стандарт». Если вы принимаете только стандарты ISO, то стандартного способа вообще нет. 'FindFirstFile' является принятым интерфейсом ОС для перечисления записей в каталоге, а Boost.Filesystem - это всего лишь оболочка этого интерфейса в Windows. Оба являются стандартами де-факто. – Philipp

4

Принятый стандарт C++ описан в N1975 ISO/IEC TS 18822: 2015, последний проект является N4100. Возможно, у вашего компилятора его еще нет, и в этом случае Boost.FileSystem обеспечивает практически то же самое.