Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;h和获取绝对路径的语法_C++_File Io_Directory_Absolute Path_Dirent.h - Fatal编程技术网

C++ c++;h和获取绝对路径的语法

C++ c++;h和获取绝对路径的语法,c++,file-io,directory,absolute-path,dirent.h,C++,File Io,Directory,Absolute Path,Dirent.h,我正在学习使用dirent。虽然这个过程很有趣,但我在使用d_名称时遇到了一个问题 我想用d_的名字做两件事 递归地搜索子目录。为此,当我遇到DT_DIR类型的文件时,我将对该函数进行递归调用 void iterateDirectory(char* filePath){ DIR* dirPtr; dirent* entry; entry = readdir(dirPtr); ... } 使用目录的d_名称作为新的char*filePath参数。所以 if(dirEntry->d_type

我正在学习使用dirent。虽然这个过程很有趣,但我在使用d_名称时遇到了一个问题

我想用d_的名字做两件事

  • 递归地搜索子目录。为此,当我遇到DT_DIR类型的文件时,我将对该函数进行递归调用

    void iterateDirectory(char* filePath){
    DIR* dirPtr;
    dirent* entry;
    entry = readdir(dirPtr);
    ...
    }
    
    使用目录的d_名称作为新的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;
    ...
    }  
    
    if(dirEntry->d_type==DT_REG){
    输入->d_名称;
    ifstream fin(条目->数据单元名称);
    如果(财务是否打开)
    
    多亏了萨姆·瓦沙维奇,我才解决了这个问题

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

    realpath(entry->d_name, buffer);
    
    这返回了build目录而不是input目录,我假设这是因为在运行代码时,变量d_name的路径确实在build目录中

    char* fullPath = realpath(inputPath, buffer);
    
    这提供了我输入的实际路径。从那里,我只是将路径转换为字符串,并在遇到目录或文件时附加路径


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

    d_name
    是目录中文件的名称。如果你
    opendir()
    编辑了一个文件路径“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文件夹最初将foo作为元素。然后,一旦我从foo读取,如果文件是目录(bar),我会将条目->d_名称添加到向量中。然后我会执行文件夹[0]。追加(“/”);文件夹[0]。追加(文件夹[1]);然后我会调用文件夹[0]处的递归函数。c_str();这可能是个愚蠢的问题,但这与执行realpath(条目->d_名称,缓冲区)不同吗?在目录名上使用realpath的语法是什么?从您的foo示例来看,它是realpath(foo,buffer)吗?