Чтение имен файлов из каталога - PullRequest
15 голосов
/ 04 марта 2009

Мне было интересно, есть ли в C ++ простой способ прочитать несколько имен файлов из папки, содержащей много файлов. Они все растровые, если кому-то интересно.

Я не очень разбираюсь в программировании Windows, поэтому я надеялся, что это можно сделать с помощью простых методов C ++.

Ответы [ 8 ]

17 голосов
/ 04 марта 2009

Boost предоставляет basic_directory_iterator, который обеспечивает стандартный итератор ввода, соответствующий стандарту C ++, который обращается к содержимому каталога. Если вы можете использовать Boost, то это как минимум кроссплатформенный код.

12 голосов
/ 04 марта 2009

Я думаю, что вы ищете FindFirstFile() и FindNextFile().

9 голосов
/ 04 марта 2009

Только что быстро просмотрел мой каталог с фрагментами. Нашел это:

vector<CStdString> filenames;
CStdString directoryPath("C:\\foo\\bar\\baz\\*");

WIN32_FIND_DATA FindFileData; 
HANDLE hFind = FindFirstFile(directoryPath, &FindFileData);

if (hFind  != INVALID_HANDLE_VALUE)
{
    do
    {
        if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
              filenames.push_back(FindFileData.cFileName);
    } while (FindNextFile(hFind, &FindFileData));

    FindClose(hFind);
}

Это дает вам вектор со всеми именами файлов в каталоге. Конечно, работает только на Windows.


Жуан Аугусто отмечен в ответе :

Не забудьте проверить после FindClose(hFind) на:

DWORD dwError = GetLastError();
if (dwError != ERROR_NO_MORE_FILES) 
{
  // Error happened        
}

Это особенно важно при сканировании по сети.

6 голосов
/ 04 марта 2009

Вы также можете использовать функции POSIX opendir () и readdir (). См. эту страницу руководства , в которой также есть отличный пример кода.

4 голосов
/ 09 февраля 2017

C ++ 17 включает в себя стандартный способ достижения этого

http://en.cppreference.com/w/cpp/filesystem/directory_iterator

#include <fstream>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main()
{
    fs::create_directories("sandbox/a/b");
    std::ofstream("sandbox/file1.txt");
    std::ofstream("sandbox/file2.txt");
    for(auto& p: fs::directory_iterator("sandbox"))
        std::cout << p << '\n';
    fs::remove_all("sandbox");
}

Возможный вывод:

sandbox/a
sandbox/file1.txt
sandbox/file2.txt
4 голосов
/ 04 марта 2009

Я рекомендую использовать встроенные функции Win32 FindFirstFile() и FindNextFile(). Это дает вам полный контроль над тем, как вы ищете файлы. Это простые C API-интерфейсы, которые не сложны в использовании.

Еще одним преимуществом является то, что ошибки Win32 не скрываются и не усложняются из-за уровня библиотеки C / C ++.

0 голосов
/ 10 февраля 2014

Почему бы не использовать glob()?

glob_t glob_result;
glob("/foo/bar/*",GLOB_TILDE,NULL,&glob_result);
for(unsigned int i=0;i<glob_result.gl_pathc;++i){
  cout << glob_result.gl_pathv[i] << endl;
}
0 голосов
/ 05 декабря 2013

Другая альтернатива -

  1. system("dir | findstr \".bmp\" > temp.txt ");
  2. Теперь прочитайте temp.txt построчно, чтобы получить все имена файлов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...