Errno无法识别所有文件

时间:2018-03-23 16:13:37

标签: c file-io directory

我正在编写一个程序,当它通过一个目录时,它能够遍历每个子目录&这些子目录中的文件。当注释掉的条件处于活动状态时,它可以正常工作,但是当删除该部分时,在文件实际存在的情况下,第二行将返回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是来自命令行的目录或文件。

1 个答案:

答案 0 :(得分:3)

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

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