【问题标题】:Errno does not recognize all filesErrno 无法识别所有文件
【发布时间】:2018-09-02 09:20:27
【问题描述】:

我正在编写一个程序,当它传递一个目录时,它能够遍历这些子目录中的每个子目录和文件。当注释掉的条件处于活动状态时,它可以正常工作,但是当删除该部分时,在某些情况下,当文件实际存在时,第二行将返回 errno == 2,而 errno == 20 仅适用于其他一些文件。我该如何解决这个问题,以便它可以识别每个文件而没有条件的注释部分?

node* directories(char* fileName, node* result){
    DIR *din = opendir(fileName);
    char currdirec[9999];
    if(errno == 20) //&& fileName[strlen(fileName)-4] == '.')
    {
        node* list = createList(fileName);
        head = NULL;
        head = mergeLists(result, list);
    }
    else
    {
        struct dirent *dir;
        getcwd(currdirec, sizeof(currdirec));
        char* temp = currdirec;
        strcat(currdirec, "/");
        strcat(currdirec, fileName);
        chdir(currdirec);
        while((dir = readdir(din)) != NULL)
        {
            if(dir->d_type == DT_REG)
            {
                directories(dir->d_name, result);
            }       
            else if(dir->d_type == DT_DIR && strcmp(dir->d_name, ".") != 0 && strcmp(dir->d_name, "..") != 0)
            {
                directories(dir->d_name, result);
                chdir(currdirec);           
            }
        }
        chdir(temp);
    }                            
    return result;
}

fileName 是命令行中的目录或文件。

【问题讨论】:

  • 当询问运行时问题时,正如这个问题所做的那样,发布minimal reproducible example,以便我们可以重现问题,以便我们可以调试它。发布的代码(大部分)对于回答您的问题毫无用处。
  • 在发布代码的其他问题中,包含哪些头文件? node的定义是什么? head的定义是什么?
  • 在linux下,errno值20被命名为:ENOTDIR,意思是Not a directory。那么为什么代码调用createList() 和mergeList() 来处理不是目录的东西呢?建议只检查来自opendir() 的返回值,如果成功,则检查目录名称是否为目录,以及名称是否与, 或.. 匹配的目录忽略它。跨度>
  • 关于:getcwd(currdirec, sizeof(currdirec)); char* temp = currdirec; strcat(currdirec, "/"); strcat(currdirec, fileName); chdir(currdirec); 已经在当前目录中执行,那么对chdir() 的调用预计会完成什么?
  • 关于:if(dir->d_type == DT_REG) 这是检查当前条目是常规文件,而不是目录,那么为什么要递归到 directories() 函数中呢?

标签: c file-io directory


【解决方案1】:

在检查是否发生错误之前,不得检查 errno 的值。 (在这种情况下,opendir 将返回 NULL 以指示错误。)如果没有报告错误,errno 可能有任何值,因此您的测试很可能是误报。

有关更多详细信息,请参阅Why does a call to the crypt() function from unistd.h set the errno to ENOENT?。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2021-01-13
    • 2013-06-12
    • 1970-01-01
    • 2022-07-07
    相关资源
    最近更新 更多