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

3
我正在学习使用dirent.h。虽然这个过程很迷人和有趣,但是在使用d_name时遇到了问题。
我想使用d_name完成两件事情。
  1. recursively search through the sub-directories. To this, when I encounter DT_DIR type files, I will make recursive call to the function

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

    within itself using d_name of the directory as a new char* filePath parameter. So,

    if(dirEntry->d_type == DT_DIR){
    entry->d_name;
    iterateDirectory(entry->d_name);
    ...
    }  
    
  2. Open all files within a directory. To do this, when I encounter DT_REG files, I will create ifstream object and open the file using d_name. So,

    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。但我认为语法是错误的。
我关于绝对路径问题的想法正确吗?还是我漏掉了其他问题?如果是绝对路径问题,获取文件绝对路径的语法是什么?
附注:
过去有人告诉我要最小化上传到stackoverflow上的代码量,我呈现了我认为所需的最小代码。如果上面提供的信息不足,请链接github页面以获取代码。

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

任何帮助都受到赞赏。谢谢!

1
d_name 是目录中文件的名称。如果你使用 opendir() 打开了一个名为 "foo/bar" 的 filePath,并且 d_name 是 "baz",那么为了打开这个文件,你显然需要打开 "foo/bar/baz" 而不仅仅是 d_name 中看到的。 - Sam Varshavchik
1
使用 realpath() 函数获取目录名的绝对路径,然后附加 d_name - Sam Varshavchik
我能想到的唯一方法是使用一个向量包含目录的初始输入的字符串或char版本。因此,std::vectorstd::string文件夹将最初具有foo作为元素。然后,一旦我从foo中读取,如果文件是目录(bar),我将添加entry->d_name到向量中。然后我将执行folders[0].append("/"); folders[0].append(folders[1]); 然后我会在folders [0] .c_str()处调用递归函数。 - Ishiro Kusabi
这可能是一个愚蠢的问题,但是这与realpath(entry->d_name,buffer)有什么不同?使用realpath获取目录名称的语法是什么?从你的foo示例中,它会是realpath(foo,buffer)吗? - Ishiro Kusabi
重新阅读realpath()的手册页面。不要只是读单词,要理解它的含义,这样一切都会变得清晰明了。 - Sam Varshavchik
显示剩余2条评论
1个回答

1
感谢Sam Varshavchik,我已经找到了问题所在。
问题确实是在于没有使用完整路径名来调用函数。我知道这一点,立即尝试使用realpath()进行修复。问题是我在entry->d_name上使用了realpath而不是目录名。
realpath(entry->d_name, buffer);

这返回了构建目录而不是输入目录。我猜测是因为在运行代码时,变量d_name的路径确实位于构建目录中。
char* fullPath = realpath(inputPath, buffer);

这让我得到了实际输入的路径。然后,我将路径转换为字符串,并在遇到目录或文件时添加路径。感谢你,Sam。你是对的。当我阅读并完全理解 realpath() 手册的内容时,一切都变得清晰明了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接