2009-03-04 11 views
14

Zastanawiam się, czy istnieje łatwy sposób w C++, aby odczytać wiele nazw plików z folderu zawierającego wiele plików. Wszystkie są bitmapami, jeśli ktoś się zastanawia.Odczytuj nazwy plików z katalogu

Niewiele wiem na temat programowania Windows, więc miałem nadzieję, że można to zrobić za pomocą prostych metod C++.

+1

Zobacz również [Jak mogę uzyskać listę plików w katalogu używającym C lub C++] (http://stackoverflow.com/questions/612097/how-can-i-get-list-of-files-in-a-directory-using-c-or-c). –

Odpowiedz

18

Boost zapewnia basic_directory_iterator, który zapewnia standard iteratora wejścia zgodnego ze standardem C++, który uzyskuje dostęp do zawartości katalogu. Jeśli możesz użyć Boost, to jest to przynajmniej kod między platformami.

4

Polecam, możesz użyć natywnych funkcji Win32 FindFirstFile() i FindNextFile(). Zapewniają one pełną kontrolę nad wyszukiwaniem plików. To są proste API C i nie są trudne w użyciu.

Inną zaletą jest to, że błędy Win32 nie są ukrywane lub trudniejsze do uzyskania z powodu warstwy biblioteki C/C++.

6

Można również użyć funkcji POSIX opendir() i readdir(). Zobacz this manual page, który również ma świetny przykładowy kod.

9

Po prostu szybko przejrzałem katalog moich fragmentów. Znalezione:

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); 
} 

Daje to wektor z wszystkimi nazwami plików w katalogu. Działa tylko w systemie Windows.


João Augusto zauważyć w answer:

Nie zapomnij sprawdzić po FindClose(hFind) dla:

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

Jest to szczególnie ważne w przypadku skanowania w sieci.

1

Inną alternatywą jest -

  1. system("dir | findstr \".bmp\" > temp.txt ");
  2. teraz czytać temp.txt wiersz po wierszu, aby wszystkie nazwy plików.
1

Dlaczego nie używać 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

Zapomniałeś sprawdzić, czy glob() zwraca zero, a także zwalnia przydzielone glob_result z globfree(). – orbitcowboy

2

C++ 17 zawiera standardowego sposób osiągnąć

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"); 
} 

Możliwe wyjście:

sandbox/a 
sandbox/file1.txt 
sandbox/file2.txt 
Powiązane problemy