使用c / c ++打开随机命名文件夹中的文件

我试图编写一个程序打开并自动读取文件。 但问题是该文件存储在一个名称未知的文件夹中。 我只知道文件夹的位置和文件的名称。 如何在char *中获取该文件的path?

编辑:例如: d:\files\<random folder>\data.txt

我不知道随机文件夹的名称,但我知道它存在于d:\files

由于这是标记为windows ,您不妨使用Windows API函数:

  • 用FindFirstFile()
  • FindNextFile()

枚举并遍历给定目录中的所有文件。

要检查目录,请查看WIN32_FIND_DATA结构中包含的WIN32_FIND_DATA (由调用Find...File()填充)。 但一定要跳过...目录。 如果需要,可以递归地完成。

您可以查看一些示例的链接,或者查看列出目录中的文件 。

如果你使用的是MFC,你可以使用CFileFind (这是API函数的一个包装):

 CFileFind finder; BOOL bWorking = finder.FindFile(_T("*.*")); while (bWorking) { bWorking = finder.FindNextFile(); TRACE(_T("%s\n"), (LPCTSTR)finder.GetFileName()); } 

为了好玩,我使用GCC 5支持的新的实验<filesystem> FS技术规范来实现它。

 #include <iostream> #include <experimental/filesystem> // for readability namespace fs = std::experimental::filesystem; int main(int, char* argv[]) { if(!argv[1]) { std::cerr << "require 2 parameters, search directory and filename\n"; return EXIT_FAILURE; } fs::path search_dir = argv[1]; if(!fs::is_directory(search_dir)) { std::cerr << "First parameter must be a directory: " << search_dir << '\n'; return EXIT_FAILURE; } if(!argv[2]) { std::cerr << "Expected filename to search for\n"; return EXIT_FAILURE; } // file to search for fs::path file_name = argv[2]; const fs::directory_iterator dir_end; // directory end sentinel // used to iterate through each subdirectory of search_dir fs::directory_iterator dir_iter(search_dir); for(; dir_iter != dir_end; ++dir_iter) { // skip non directories if(!fs::is_directory(dir_iter->path())) continue; // check directory for file // iterate through files in this subdirectory dir_iter->path() auto file_iter = fs::directory_iterator(dir_iter->path()); for(; file_iter != dir_end; ++file_iter) { // ignore directories and wrong filenames if(fs::is_directory(file_iter->path()) || file_iter->path().filename() != file_name) continue; // Ok we found it (the first one) std::cout << "path: " << file_iter->path().string() << '\n'; return EXIT_SUCCESS; } } // Not found std::cout << file_name << " was not found in " << search_dir.string() << '\n'; return EXIT_FAILURE; } 

这个想法是:列出d:\files下的目录并尝试打开每个目录中的文件。

目前还没有一种标准的C ++方式来获取所有现有的文件/目录。 一个简单而粗鲁的做法是

 system("dir d:\\files /b /ad > tmpfile"); 

这将列出所有目录( /ad ),重定向到一个临时文件。 然后打开文件:

 std::ifstream list("tmpfile"); 

并阅读它:

 std::string dirname; std::string filename; while (std::getline(list, dirname)) { filename = "d:\\files\\" + dirname + "\\data.txt"; if ( ... file exists ... ) break; } 

我把这种方法称之为粗糙的,因为它有难以解决的问题:

  • 它会覆盖可能有用的文件
  • 如果当前目录是只读的,它不起作用
  • 它只会在Windows中工作

有可能使用_popenfgets而不是重定向到文件。