【发布时间】:2020-11-19 08:51:41
【问题描述】:
我正在尝试打开一个目录并读取文件和文件夹,如果它是一个文件夹,则在末尾添加“/”。这是我当前的代码。
#include <dirent.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int isDir(const char* target)
{
struct stat statbuf;
stat(target, &statbuf);
return S_ISDIR(statbuf.st_mode);
}
int main(int argc, char * argv[])
{
puts("");
struct stat sfile;
struct dirent *dp;
char * dir;
if(argc != 2)
dir = getenv("PWD"); //default
else
dir = argv[1];
DIR *dirp = opendir(dir);
dp = readdir(dirp);
while ( dp != NULL )
{
stat(dp->d_name,&sfile);
//opendir(dp->d_name);
printf("Size : %ld ",sfile.st_size);
if (isDir(dp->d_name))
{
printf("%s/\n",dp->d_name);
}
else
{
printf("%s \n",dp->d_name);
}
dp = readdir(dirp);
}
printf("\n");
closedir(dirp);
}
这在我不传递任何参数时有效,即它正在读取当前工作目录中的文件和文件夹。当我将目录作为参数传递时,它无法将其中的其他文件夹检测为目录。奇怪的是,当我尝试使用 opendir() 打开时尝试使用 errno 时,所有内容都被检测为目录。
int isDir2(const char* target)
{
opendir(target);
if(errno == ENOTDIR)
{
puts("Not directory");
return 0;
}
else
{
puts("Directory"); //only this is getting printed
return 1;
}
}
在任何一种情况下,当两个 '.'和 '..' 被检测为目录,但其余部分为目录或文件,具体取决于我使用的是 opendir() 的 errno 还是 S_ISDIR。
【问题讨论】:
-
在验证结果不成功之前检查
errno不是一个好主意。并非所有函数都会在成功时将errno设置为零。