如何获得C ++目录中的文件列表?

如何获得目录中的文件列表,以便每个文件都可以被处理?

标准C ++不提供这样做的方法。 但boost::filesystem可以做到这一点: http : //www.boost.org/doc/libs/1_37_0/libs/filesystem/example/simple_ls.cpp

以下是我使用的:

 /* Returns a list of files in a directory (except the ones that begin with a dot) */ void GetFilesInDirectory(std::vector<string> &out, const string &directory) { #ifdef WINDOWS HANDLE dir; WIN32_FIND_DATA file_data; if ((dir = FindFirstFile((directory + "/*").c_str(), &file_data)) == INVALID_HANDLE_VALUE) return; /* No files found */ do { const string file_name = file_data.cFileName; const string full_file_name = directory + "/" + file_name; const bool is_directory = (file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; if (file_name[0] == '.') continue; if (is_directory) continue; out.push_back(full_file_name); } while (FindNextFile(dir, &file_data)); FindClose(dir); #else DIR *dir; class dirent *ent; class stat st; dir = opendir(directory); while ((ent = readdir(dir)) != NULL) { const string file_name = ent->d_name; const string full_file_name = directory + "/" + file_name; if (file_name[0] == '.') continue; if (stat(full_file_name.c_str(), &st) == -1) continue; const bool is_directory = (st.st_mode & S_IFDIR) != 0; if (is_directory) continue; out.push_back(full_file_name); } closedir(dir); #endif } // GetFilesInDirectory 

这里是Linux上C的一个例子。 那就是,如果你在Linux上,不介意在ANSI C中做这么一点点。

 #include <dirent.h> DIR *dpdf; struct dirent *epdf; dpdf = opendir("./"); if (dpdf != NULL){ while (epdf = readdir(dpdf)){ printf("Filename: %s",epdf->d_name); // std::cout << epdf->d_name << std::endl; } } closedir(dpdf); 

你必须使用操作系统调用(例如Win32 API)或者使用它们的包装。 我倾向于使用Boost.Filesystem,因为它比Win32 API(以及跨平台)的混乱要好 。

如果您正在寻找使用Win32 API,Microsoft有msdn上的函数和示例的列表。

解决这个问题需要一个平台特定的解决scheme。 在Windows上查找unix / linux或FindFirstFile()上的opendir()。 或者,有许多库将为您处理平台特定部分。

如果您在Windows中并使用MSVC,则MSDN库具有这样的示例代码。

以下是该链接的代码:

 #include <windows.h> #include <tchar.h> #include <stdio.h> #include <strsafe.h> void ErrorHandler(LPTSTR lpszFunction); int _tmain(int argc, TCHAR *argv[]) { WIN32_FIND_DATA ffd; LARGE_INTEGER filesize; TCHAR szDir[MAX_PATH]; size_t length_of_arg; HANDLE hFind = INVALID_HANDLE_VALUE; DWORD dwError=0; // If the directory is not specified as a command-line argument, // print usage. if(argc != 2) { _tprintf(TEXT("\nUsage: %s <directory name>\n"), argv[0]); return (-1); } // Check that the input path plus 2 is not longer than MAX_PATH. StringCchLength(argv[1], MAX_PATH, &length_of_arg); if (length_of_arg > (MAX_PATH - 2)) { _tprintf(TEXT("\nDirectory path is too long.\n")); return (-1); } _tprintf(TEXT("\nTarget directory is %s\n\n"), argv[1]); // Prepare string for use with FindFile functions. First, copy the // string to a buffer, then append '\*' to the directory name. StringCchCopy(szDir, MAX_PATH, argv[1]); StringCchCat(szDir, MAX_PATH, TEXT("\\*")); // Find the first file in the directory. hFind = FindFirstFile(szDir, &ffd); if (INVALID_HANDLE_VALUE == hFind) { ErrorHandler(TEXT("FindFirstFile")); return dwError; } // List all the files in the directory with some info about them. do { if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { _tprintf(TEXT(" %s <DIR>\n"), ffd.cFileName); } else { filesize.LowPart = ffd.nFileSizeLow; filesize.HighPart = ffd.nFileSizeHigh; _tprintf(TEXT(" %s %ld bytes\n"), ffd.cFileName, filesize.QuadPart); } } while (FindNextFile(hFind, &ffd) != 0); dwError = GetLastError(); if (dwError != ERROR_NO_MORE_FILES) { ErrorHandler(TEXT("FindFirstFile")); } FindClose(hFind); return dwError; } void ErrorHandler(LPTSTR lpszFunction) { // Retrieve the system error message for the last-error code LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); // Display the error message and exit the process lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR), TEXT("%s failed with error %d: %s"), lpszFunction, dw, lpMsgBuf); MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf); } 

我只是问了一个类似的问题 ,这里是我的解决scheme基于收到的答案(使用boost::filesystem库):

 #include <string> #include <iostream> #include <boost/filesystem.hpp> using namespace std; using namespace boost::filesystem; int main() { path p("D:/AnyFolder"); for (auto i = directory_iterator(p); i != directory_iterator(); i++) { if (!is_directory(i->path())) //we eliminate directories in a list { cout << i->path().filename().string() << endl; } else continue; } } 

输出如下所示:

 file1.txt file2.dat 

合并了很多片段之后,我终于find了一个不会带来错误的地方,会接受一个std :: string参数并且是可重用的。

 #include <atlstr.h> void getFiles(CString directory) { Console console; HANDLE dir; WIN32_FIND_DATA file_data; CString file_name, full_file_name; if ((dir = FindFirstFile((directory + "/*"), &file_data)) == INVALID_HANDLE_VALUE) { // Invalid directory } while (FindNextFile(dir, &file_data)) { file_name = file_data.cFileName; full_file_name = directory + file_name; if (strcmp(file_data.cFileName, ".") != 0 && strcmp(file_data.cFileName, "..") != 0) { std::string fileName = full_file_name.GetString(); // Do stuff with fileName } } } 

要访问该方法,只需调用:

 getFiles("i:\\Folder1"); 

或者你这样做,然后读出test.txt:

 #include <windows.h> int main() { system("dir /b > test.txt"); } 

“/ b”意味着文件名被返回,没有更多的信息。

 HANDLE WINAPI FindFirstFile( __in LPCTSTR lpFileName, __out LPWIN32_FIND_DATA lpFindFileData ); 

设置属性只查找目录。

您可以使用以下代码获取目录中的所有文件。在Andreas Bonini答案中进行一个简单的修改以消除“。”的出现。 和“..”

 CString dirpath="d:\\mydir" DWORD errVal = ERROR_SUCCESS; HANDLE dir; WIN32_FIND_DATA file_data; CString file_name,full_file_name; if ((dir = FindFirstFile((dirname+ "/*"), &file_data)) == INVALID_HANDLE_VALUE) { errVal=ERROR_INVALID_ACCEL_HANDLE; return errVal; } while (FindNextFile(dir, &file_data)) { file_name = file_data.cFileName; full_file_name = dirname+ file_name; if (strcmp(file_data.cFileName, ".") != 0 && strcmp(file_data.cFileName, "..") != 0) { m_List.AddTail(full_file_name); } } 

C ++ 11 / Linux版本:

 #include <dirent.h> if (auto dir = opendir("some_dir/")) { while (auto f = readdir(dir)) { if (!f->d_name || f->d_name[0] == '.') continue; // Skip everything that starts with a dot printf("File: %s\n", f->d_name); } closedir(dir); } 
 void getFilesList(String filePath,String extension, vector<string> & returnFileName) { WIN32_FIND_DATA fileInfo; HANDLE hFind; String fullPath = filePath + extension; hFind = FindFirstFile(fullPath.c_str(), &fileInfo); if (hFind == INVALID_HANDLE_VALUE){return;} else { return FileName.push_back(filePath+fileInfo.cFileName); while (FindNextFile(hFind, &fileInfo) != 0){ return FileName.push_back(filePath+fileInfo.cFileName);} } } String optfileName =""; String inputFolderPath =""; String extension = "*.jpg*"; getFilesList(inputFolderPath,extension,filesPaths); vector<string>::const_iterator it = filesPaths.begin(); while( it != filesPaths.end()) { frame = imread(*it);//read file names //doyourwork here ( frame ); sprintf(buf, "%s/Out/%d.jpg", optfileName.c_str(),it->c_str()); imwrite(buf,frame); it++; }