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

opening a file in random named folder using c/c++

本文关键字:文件 一个 文件夹 c++ 随机 使用      更新时间:2023-10-16

我正在尝试编写一个程序,它会自动打开并读取文件。但问题是文件存储在一个名称未知的文件夹中。我只知道文件夹的位置和文件名。如何在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中工作

可以使用_popenfgets,而不是重定向到文件。