使用c/c++在随机命名的文件夹中打开一个文件
opening a file in random named folder using c/c++
我正在尝试编写一个程序,它会自动打开并读取文件。但问题是文件存储在一个名称未知的文件夹中。我只知道文件夹的位置和文件名。如何在char*中获取该文件的路径?
编辑:示例:d:files<random folder>data.txt
我不知道随机文件夹的名称,但我知道它存在于d:files
中
由于这被标记为windows
,您还可以使用Windows API函数:
- FindFirstFile()
- FindNextFile()
枚举并循环遍历给定目录中的所有文件。
要检查目录,请查看WIN32_FIND_DATA
结构中包含的dwFileAttributes
(由对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
,而不是重定向到文件。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 挂起和取消挂起一个文件DLL
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- C++试图读取一个文件并输出到另一个文本文件
- 如何从另一个文件继承私有成员变量和公共函数
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 如何打开并写入一个名称取自C++中字符串的文件
- 构建一个由C和C++文件组成的库
- c++多进程编写一个唯一的文件
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何将class.cpp和class.hpp编译为一个.o文件
- 写入文件会产生一个空文件或根本没有文件
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 生成一个生成文件,该生成文件使用Automake在一个步骤中编译和链接所有源文件
- 为什么我的 heap.h 文件给我一个LNK2001错误?
- Pantheios 不使用 MFC 应用程序写入一个文件(一个 exe + 两个 DLL)
- 在C++中一次读取一个文件一个int
- 输入/输出文件(一个字母的大写)
- 如何使用两个预编译的头文件.一个用于托管代码,另一个用于非托管代码.xxx.PCH不是一个有效的预编译头文件