【发布时间】: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()函数中呢?