c ++ dirent.h和获取绝对路径的语法

时间:2016-11-26 00:38:24

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

我正在学习使用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;
    ...
    }  
    
  3. 我遇到的问题是,void iterateDirectory()函数和ifstream fin()似乎都没有将entry-&gt; d_name识别为有效输入。当我使用d_name调用iterate函数或使用带有entry-&gt; d_name的ifstream时,我检查目录或文件是否打开失败。函数本身正在工作,因为我已经使用不同的char *输入检查了完全相同的函数。我能想到的唯一问题是我的函数没有将绝对路径作为参数。

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

    我对绝对路径问题是对的吗?或者我还有另一个问题吗?如果是绝对路径问题,获取文件的绝对路径的语法是什么?

    P.S。

    我已经被告知过去最小化我上传到堆栈溢出的代码数量,我提出了我认为最小的代码。如果上面提供的信息不足,我将链接github页面代码。

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

    感谢任何和所有帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

感谢Sam Varshavchik,我已经找到了问题。

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

realpath(entry->d_name, buffer);

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

char* fullPath = realpath(inputPath, buffer);

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

再次感谢Sam。你是对的。当我阅读并完全理解realpath()手册所说的内容时,这一切都是有道理的。