Чтение имен файлов из каталога
Мне было интересно, есть ли простой способ в С++ читать несколько имен файлов из папки, содержащей много файлов. Они все растровые изображения, если кто-то задается вопросом.
Я мало знаю о программировании окон, поэтому я надеялся, что это можно сделать с помощью простых методов на С++.
Ответы
Ответ 1
Boost предоставляет basic_directory_iterator
, который предоставляет совместимый входной итератор стандарта С++, который обращается к содержимому каталога. Если вы можете использовать Boost, то это, по крайней мере, кросс-платформенный код.
Ответ 2
Я думаю, что вы ищете FindFirstFile()
и FindNextFile()
.
Ответ 3
Просто быстро просмотрел каталог моих фрагментов. Найдено:
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, конечно.
João Augusto отмечен в :
Не забудьте проверить после FindClose(hFind)
для:
DWORD dwError = GetLastError();
if (dwError != ERROR_NO_MORE_FILES)
{
// Error happened
}
Это особенно важно при сканировании в сети.
Ответ 4
Вы также можете использовать функции POSIX opendir() и readdir(). См. эту страницу руководства, которая также содержит отличный примерный код.
Ответ 5
Я рекомендую вам использовать собственные функции Win32 FindFirstFile()
и FindNextFile()
. Это дает вам полный контроль над поиском файлов. Это простые API-интерфейсы C и их не сложно использовать.
Еще одно преимущество заключается в том, что ошибки Win32 не скрыты или сложнее получить из-за уровня библиотеки C/С++.
Ответ 6
С++ 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
Ответ 7
Другая альтернатива -
-
system("dir | findstr \".bmp\" > temp.txt ");
- Теперь прочитайте temp.txt по очереди, чтобы получить все имена файлов.
Ответ 8
Почему бы не использовать 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;
}