我正在学习使用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-&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
感谢任何和所有帮助。谢谢!
答案 0 :(得分:0)
感谢Sam Varshavchik,我已经找到了问题。
问题确实在于没有使用完整路径名调用函数。我知道这一点,并立即尝试用realpath()修复它。问题是我在entry-&gt; d_name而不是目录名上使用了realpath。
realpath(entry->d_name, buffer);
这返回了构建目录而不是输入目录。我假设这是因为在运行代码时,变量d_name的路径确实在构建目录中。
char* fullPath = realpath(inputPath, buffer);
这给了我输入的实际路径。从那里开始,我只是将路径转换为字符串,并在遇到目录或文件时附加路径。
再次感谢Sam。你是对的。当我阅读并完全理解realpath()手册所说的内容时,这一切都是有道理的。