【问题标题】:c++ dirent.h and syntax for getting absolute pathc++ dirent.h 和获取绝对路径的语法
【发布时间】:2017-04-10 09:05:19
【问题描述】:

我正在学习使用 dirent.h。虽然这个过程很有趣,但我在使用 d_name 时遇到了问题。

我想用 d_name 做两件事。

  1. 递归搜索子目录。对此,当我遇到DT_DIR类型的文件时,我会对该函数进行递归调用

    void iterateDirectory(char* filePath){
    DIR* dirPtr;
    dirent* entry;
    entry = readdir(dirPtr);
    ...
    }
    

    在其内部使用目录的 d_name 作为新的 char* filePath 参数。所以,

    if(dirEntry->d_type == DT_DIR){
    entry->d_name;
    iterateDirectory(entry->d_name);
    ...
    }  
    
  2. 打开目录中的所有文件。为此,当我遇到 DT_REG 文件时,我将创建 ifstream 对象并使用 d_name 打开文件。所以,

    if(dirEntry->d_type == DT_REG){
    entry->d_name;
    ifstream fin(entry->d_name);
    if(fin.is_open)
        cout<<"Opened"<<endl;
    else
        cout<<"Not Opened"<<endl;
    ...
    }  
    

我遇到的问题是 void iterateDirectory() 函数和 ifstream fin() 似乎都没有将 entry->d_name 识别为有效输入。当我使用 d_name 调用迭代函数或将 ifstream 与 entry->d_name 一起使用时,我检查目录或文件是否打开失败。该函数本身正在运行,因为我检查了具有不同 char* 输入的完全相同的函数。我能想到的唯一问题是我的函数没有以绝对路径作为参数。

我的问题是如何在迭代时找到给定文件或子目录的绝对路径。我最初的解决方案是使用“。”因为那是当前目录。存储“.”的地址成一个字符串,并附加“\”+entry->d_name。但我认为语法是错误的。

我对绝对路径问题是否正确?还是我缺少另一个问题?如果是绝对路径问题,获取文件绝对路径的语法是什么?

附言

过去我被告知要尽量减少上传到堆栈溢出问题的代码量,我提出了我认为所需的最小代码。如果上面提供的信息不足,我正在链接github页面的代码。

https://github.com/ForeverABoy/dirent.h_practice/blob/master/directoryIterator.cpp

感谢所有帮助。谢谢!

【问题讨论】:

  • d_name 是目录中文件的名称。如果你opendir()ed 一个 filePath 为 "foo/bar",而d_name 是 "baz",为了打开那个文件你显然必须打开 "foo/bar/baz",而不仅仅是您在d_name 中看到的内容。
  • 山姆,谢谢你的帮助。我意识到问题出在绝对路径上,我试图找出一种从给定输入中获取目录绝对路径的方法。使用 realpath(entry->d_name, buffer) 并没有太大帮助,因为 1. realpath 为我提供了代码的构建目录而不是输入目录。 2. 即使使用文件构建目录,它也不会更新子目录的地址。从 foo 到 foo/bar 之后,当它搜索 baz 时,realpath() 给了我 foo/baz 而不是 foo/bar/baz。
  • 目录名上使用realpath()来获取目录的绝对路径。然后追加d_name
  • 我能想到的唯一方法是让向量包含目录初始输入的字符串或 char* 版本。所以 std::vector<:string> 文件夹最初将 foo 作为一个元素。然后,一旦我从 foo 读入,如果文件是目录(bar),我会将 entry->d_name 添加到向量中。然后我会做文件夹[0].append("/");文件夹[0].append(文件夹[1]);然后我会在文件夹[0].c_str();处调用递归函数
  • 这可能是一个愚蠢的问题,但这与做 realpath(entry->d_name, buffer) 有什么不同?在目录名称上使用 realpath 的语法是什么?从您的 foo 示例中,它会是 realpath(foo,buffer) 吗?

标签: c++ file-io directory absolute-path dirent.h


【解决方案1】:

感谢 Sam Varshavchik,我找到了问题所在。

问题确实在于没有使用完整路径名调用函数。我知道这一点并立即尝试使用 realpath() 修复它。问题是我在 entry->d_name 上使用了 realpath 而不是目录名。

realpath(entry->d_name, buffer);

这将返回构建目录而不是输入目录。我认为这是因为在运行代码时,变量 d_name 的路径确实在构建目录中。

char* fullPath = realpath(inputPath, buffer);

这给了我输入的实际路径。从那里,我只是将路径转换为字符串,并在遇到目录或文件时附加路径。

再次感谢山姆。你说的对。当我阅读并完全理解 realpath() 手册所说的内容时,一切都说得通了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-15
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多