我试图编写一个程序打开并自动读取文件。 但问题是该文件存储在一个名称未知的文件夹中。 我只知道文件夹的位置和文件的名称。 如何在char *中获取该文件的path?
编辑:例如: d:\files\<random folder>\data.txt
我不知道随机文件夹的名称,但我知道它存在于d:\files
由于这是标记为windows
,您不妨使用Windows API函数:
枚举并遍历给定目录中的所有文件。
要检查目录,请查看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; }
我把这种方法称之为粗糙的,因为它有难以解决的问题:
有可能使用_popen
和fgets
而不是重定向到文件。