微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

符号链接的Linux命令文件

Linux:用一个例外文件删除比date更早的每个文件

文本文件到纯数组中的string数组?

如何使用Windows命令行search文件,然后用位置创build文本文档?

在Windows中locking文件

linux:数据是否写入文件,保证其他进程可见?

pythonsubprocess覆盖文件用于标准输出 – 我需要它附加到文件(Windows)

如何捕获文件复制/移动事件的细节,如源文件

文件在多个进程上

如何在不lockingperl的情况下locking日志文件

由于这是标记为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("%sn"),(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 filenamen"; 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 forn"; 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中工作

有可能使用_popen和fgets而不是重定向文件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐