列出C ++目录中的所有文本文件

我试图将所有txt文件的名称存储在一个string的目录中,并将其打印出来。 我需要计算目录中的txt文件的数量,然后打印名称。 计数的部分工作,但我似乎无法得到工作的名称。 我已经find了一些例子,但他们没有在我正在使用的视觉工作室工作。

这是我的代码。

int main() { bool x = true; int i = 0; wchar_t* file = L"../Menu/Circuitos/*.txt"; WIN32_FIND_DATA FindFileData; HANDLE hFind; hFind = FindFirstFile(file, &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { i++; while ((x = FindNextFile(hFind, &FindFileData)) == TRUE) { i++; } } cout << "number of files " << i << endl; return 0; } 

FindFirstFile已经有了第一个有效的句柄。 如果您立即调用FindNextFile则第一个句柄丢失。 你的例子中的文件数是错误的。

使用do-while循环istead。

另外,从FindFirstFile获得的句柄必须用FindClose关闭

 HANDLE hFind; hFind = FindFirstFile(file, &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { do { wcout << FindFileData.cFileName << "\n"; i++; } while (FindNextFile(hFind, &FindFileData)); FindClose(hFind); } cout << "number of files " << i << endl; 

使用std::vectorstd::wstring来存储项目

 #include <string> #include <vector> ... std::vector<std::wstring> vs; HANDLE hFind; hFind = FindFirstFile(file, &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { do { vs.push_back(FindFileData.cFileName); } while (FindNextFile(hFind, &FindFileData)); FindClose(hFind); } std::cout << "count:" << vs.size() << "\n"; for (auto item : vs) std::wcout << item << "\n"; 

对于一些较旧的编译器, auto可能不可用,请使用它

 for (int i = 0; i < vs.size(); i++) std::wcout << vs[i] << "\n"; 

请注意,Windows API与C字符串一起工作。 在许多情况下,您必须使用.c_str()来获取字符数组。 例如:

 if (vs.size()) { std::wstring str = vs[0]; MessageBox(0, str.c_str(), 0, 0); } 

这是一个使用新的ISO标准文件系统库TS (技术规范)的便携式版本,支持那些支持它的编译器:

 #include <vector> #include <iostream> #include <algorithm> #include <experimental/filesystem> // for readability namespace fs = std::experimental::filesystem; /** * Function object to test directory entries * for a specific file extension. */ struct file_extension_is { std::string ext; file_extension_is(std::string const& ext): ext(ext) {} bool operator()(fs::directory_entry const& entry) const { return entry.path().extension() == ext; } }; int main(int, char* argv[]) { try { // directory supplied on the command line if present // else current directory fs::path dir = argv[1] ? argv[1] : "."; // place to store the results std::vector<fs::directory_entry> entries; // copy directory entries that have file extension ".txt" // to the results fs::directory_iterator di(dir); fs::directory_iterator end; std::copy_if(di, end, std::back_inserter(entries), file_extension_is(".txt")); // print it all out std::cout << "Number of files: " << entries.size() << '\n'; for(auto const& entry: entries) std::cout << entry.path().string() << '\n'; } catch(std::exception const& e) { std::cerr << e.what() << '\n'; } catch(...) { std::cerr << "Unknown exception." << '\n'; } }