1、opendir函数
DIR *opendir(const char*name);
参数:一个目录路径,可以是相对也可以绝对;
返回值:成功返回指向目录结构体的指针,失败返回NULL;
2、closedir函数,关闭打开的目录。注意写了opendir函数不能忘记closedir
int closedir(DIR *dirp);
参数:opendir函数的返回值
返回值:成功返回0.失败返回-1,设置errno
3、readdir函数,读目录
struct dirent *readdir(DIR*dirp);
参数:opendir返回值
返回值:成功返回目录项结构体指针,失败返回NULL,设置errno
struct dirent{
ino_t d_ino; //inode编号
.....
char d_name[256]; //文件名
}
4、stat函数,获取文件属性
int stat(const char*path,struct stat*buf);
参数1:文件名
参数2:传出参数
返回值:成功返回0,失败返回-1;
struct stat{
dev_t st_dev;
ino_t st_ino; //inode号
mode_t st_mode;
nlink_t st_nlink; //硬连接数
uid_t st_uid; //用户id
gid st_gid; //组id
off_t st_size;
}
通过st_mode宏函数来判断:
S_ISREG(m) 是不是普通文件
S_ISDIR(m) 是否是目录
S_ISCHR (m) 是否是字符设备
S_ISFIFO(m) 管道
S_ISLNK (m) 符号链接
S_ISSOCK(m) 套接字
上代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<unistd.h> 4 #include<string.h> 5 #include<dirent.h> 6 #include<sys/stat.h> 7 void IsFile(char*); 8 //打开目录读取目录 9 void read_dir(char *dir) 10 { 11 char path[256]; 12 DIR*dp; 13 struct dirent *sdp; 14 dp=opendir(dir); 15 if(dp==NULL) 16 { 17 perror("opendir error\n"); 18 exit(1); 19 } 20 21 while((sdp=readdir(dp))!=NULL) 22 { 23 if((strcmp(sdp->d_name,".")==0)||(strcmp(sdp->d_name,"..")==0)) 24 continue; 25 //目录项本身不可访问 26 sprintf(path,"%s/%s",dir,sdp->d_name); 27 IsFile(path); //拼接好带路径的文件名继续判断 28 } 29 closedir(dp);//关闭打开的目录 30 } 31 void IsFile(char *name) 32 { 33 //获取文件属性,判断文件类型 34 struct stat sbuf; 35 int ret=stat(name,&sbuf); 36 if(ret==-1) 37 { 38 perror("stat error\n"); 39 exit(1); 40 } 41 //是目录文件 42 if(S_ISDIR(sbuf.st_mode)) 43 { 44 read_dir(name); 45 } 46 //普通文件直接打印 47 else 48 printf("%s\t%ld\n",name,sbuf.st_size); 49 return; 50 51 } 52 int main(int argc,char *argv[]) 53 { 54 //先传一个命令行参数 58 IsFile(argv[1]); 59 60 return 0; 61 }
原文:https://www.cnblogs.com/xiaoxiaolinux/p/13770570.html