C-打开并读取目录,然后确定文件类型
好吧,我有一些问题。以下是我的代码(在此之前调用的opendir()): 我正在读取一个目录并确定其中的文件类型。唯一的问题是,这将始终打印“目录”,我相信这与对lstat的调用有关。我不确定如何适当地改变它 问题是C-打开并读取目录,然后确定文件类型,c,stat,opendir,readdir,C,Stat,Opendir,Readdir,好吧,我有一些问题。以下是我的代码(在此之前调用的opendir()): 我正在读取一个目录并确定其中的文件类型。唯一的问题是,这将始终打印“目录”,我相信这与对lstat的调用有关。我不确定如何适当地改变它 问题是dp->d_name只包含文件名,而不包含完整路径。所以它可能会失败,但您不会注意到,因为您没有测试它的返回值 您需要预先指定目录的路径(即,您传递给opendir)的内容。我可以看到两个明显的问题: 你没有建立正确的路径。除非您在目录中(即您确实在opendir(“.”),否则您将
dp->d_name
只包含文件名,而不包含完整路径。所以它可能会失败,但您不会注意到,因为您没有测试它的返回值
您需要预先指定目录的路径(即,您传递给
opendir
)的内容。我可以看到两个明显的问题:
opendir(“.”
),否则您将错误的路径传递到lstat()
。您需要将目录名与每个文件名连接起来。打开目录并不意味着将其设置为当前目录lstat()
是否成功您需要在文件名的路径前面加上前缀;lstat()不知道文件所在的目录。还要检查lstat()的返回值
while( (dp = readdir(dfd)) != NULL ) {
if( strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)
continue;
lstat(dp->d_name, &stbuf);
printf("%s: ", dp->d_name);
if( S_ISDIR(stbuf.st_mode) )
puts("Directory");
else if ( S_ISREG(stbuf.st_mode) )
puts("File");
else if ( S_ISCHR(stbuf.st_mode) )
puts("Character Device");
else if ( S_ISBLK(stbuf.st_mode) )
puts("Block Device");
else if ( S_ISFIFO(stbuf.st_mode) )
puts("Fifo");
else if ( S_ISLNK(stbuf.st_mode) )
puts("Link");
else
puts("Socket");
}
return;
}
lstat(dp->d_name, &stbuf);