【发布时间】:2017-04-10 09:05:19
【问题描述】:
我正在学习使用 dirent.h。虽然这个过程很有趣,但我在使用 d_name 时遇到了问题。
我想用 d_name 做两件事。
-
递归搜索子目录。对此,当我遇到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); ... } -
打开目录中的所有文件。为此,当我遇到 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