3

我正在学习使用 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

任何和所有的帮助表示赞赏。谢谢!

4

1 回答 1

1

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

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

realpath(entry->d_name, buffer);

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

char* fullPath = realpath(inputPath, buffer);

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

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

于 2016-11-26T02:52:16.373 回答