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

时间:2016-01-06 15:47:45

标签: c++ windows file

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

修改:示例:d:\files\<random folder>\data.txt

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

3 个答案:

答案 0 :(得分:2)

由于标记为windows,因此您也可以使用Windows API函数:

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

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

您可以查看链接以获取一些示例,或参阅Listing the Files in a Directory

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

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

答案 1 :(得分:2)

为了好玩,我使用<filesystem>支持的新的实验GCC 5 FS Technical Specification实现了这一点。

#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;
}

答案 2 :(得分:-3)

想法是:列出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代替重定向到文件。

相关问题