首页 新闻 赞助 找找看

Linux 使用stat结构体访问目录,分辨不了文件和目录

0
[待解决问题]

include<stdio.h>

include<stdlib.h>

include<string.h>

include<sys/stat.h>

include<dirent.h>

include<fcntl.h>

include<unistd.h>

int main(int argc,char argv[]){
DIR
dp;
struct dirent dr;
struct stat buf;
char
s_path,*d_path;
s_path=argv[1];
d_path=argv[2];
dp=opendir(s_path);
while((dr=readdir(dp))!=NULL){
stat(dr->d_name,&buf);
puts(dr->d_name);
printf("%od\n",buf.st_mode);
if(S_ISDIR(buf.st_mode)){
printf("this is a dir\n");
}
}
return 0;
}

c和dir不应该是目录吗?怎么被错认为文件了

wJune的主页 wJune | 菜鸟二级 | 园豆:204
提问于:2018-10-31 10:46
< >
分享
所有回答(3)
0

你把代码整理一下缩进再重新发一下吧

glob | 园豆:212 (菜鸟二级) | 2018-10-31 17:38

我缩进了,但是一发出来就变成这样了...很无语

支持(0) 反对(0) wJune | 园豆:204 (菜鸟二级) | 2018-10-31 17:46
0

首先,你没有很了解stat的用法,觉得只要获得他们的属性即可判断是文件还是目录,其实还需要继续判断的。

int stat(const char pathname, struct stat buf);
定义了
struct stat buf,
那么当打开一个存在的文件路径pathname时候,需要使用
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
这些来进行判断,或者使用
if(buf.st_mode | xxx )来进行判断,xxx表示以下宏:
S_IFMT 0170000 bit mask for the file type bit field
S_IFSOCK 0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO

这样你就可以判断哪一个是目录哪一个是文件了

Psrion | 园豆:29 (初学一级) | 2018-11-29 14:18
0

readdir函数返回的是一个指针,但是dr是一个结构体,不是指针变量

dreamingcloud | 园豆:213 (菜鸟二级) | 2019-01-09 15:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册