LINUX下遍历目录的核心头文件是#include ,方法一般是这样的:打开目录->读取->关闭目录。相关函数有:DIR *opendir(const char *dirname);struct dirent *readdir(DIR *dirp);int closedir(DIR *dirp);注意到,在读取的时候,是返回一个叫dirent的结构体,其定义是这样的:
-
struct dirent{
-
long d_ino;
-
off_t d_off;
-
unsigned short d_reclen;
-
char d_name [NAME_MAX+1];
-
}
结构体中d_ino存放的是该文件的结点数目,什么是结点数目呢,我也说不清楚了,呵呵,d_off是文件在目录中的编移,具体是什么意思我也不是很明白,很少用,其本上就是用到:short d_reclen是这个文件的长度,需要注意的是这里的长度并不是指文件大小,因为大小和长度是2回事了,你可以用lseek将文件长度移得很长,但大小其实还是那么大,不过一般情况下,可以视为相同。最后一个元素就是我们要的了,文件名称!
而判断一个文件是文件还是文件夹则用到#include 这个文件,同样有一个stat的结构体,struct stat这个结构体是用来描述一个linux系统文件系统中的文件属性的结构。通过函数:int stat(const char *path, struct stat *struct_stat);将路径与这个结构体链接起来,再判断是否路径。struct stat这个结构体具体如下:
-
struct stat{
-
mode_t st_mode;
-
ino_t st_ino;
-
dev_t st_dev;
-
dev_t st_rdev;
-
nlink_t st_nlink;
-
uid_t st_uid;
-
gid_t st_gid;
-
off_t st_size;
-
time_t st_atime;
-
time_t st_mtime;
-
time_t st_ctime;
-
blksize_t st_blksize;
-
blkcnt_t st_blocks;
-
};
那么具体怎么用呢?下面用一个例子说明问题,程序具体完成的功能如下:
有如下的一个文件夹:
用户运行程序,第一个参数指定这个文件夹,就将这个文件夹遍历出来,同时打印文件长度,并且判断这个文件夹是目录还是文件。
同时还要注意,用户在路径末端有/或者没有/都是可以执行的:
具体的代码如下,其中用到除了上述的内容以外,还说明了main参数如何用,唯一需要强调一下char* argv[]这个字符串输入中,第0个位置argv[0]是程序名,也就是上面的./read_dic,第1个位置argv[1]才是用户输入的第一个参数,同时,还用到了《【Linux】纯C环境下字符串的处理》(点击打开链接)的部分内容,这里就不赘述了。
-
#include
-
#include
-
#include //输出文件信息
-
#include //判断是否目录
-
#include
-
int is_dir(char* path){
-
struct stat st;
-
stat(path,&st);
-
if(S_ISDIR(st.st_mode)){
-
return 1;
-
}
-
else{
-
return 0;
-
}
-
}
-
char* str_contact(const char* str1,const char* str2){
-
char* result;
-
result=(char*)malloc(strlen(str1)+strlen(str2)+1);
-
if(!result){
-
printf("字符串连接时,内存动态分配失败\n");
-
exit(1);
-
}
-
strcat(result,str1);
-
strcat(result,str2);
-
return result;
-
}
-
-
int main(int argc,char *argv[]){
-
char* path=argv[1];
-
argv[1]=str_contact(argv[1],"/");
-
DIR* dp;
-
struct dirent* filename;
-
dp=opendir(path);
-
if(!dp){
-
printf("打开文件夹失败!\n");
-
return 0;
-
}
-
while(filename=readdir(dp)){
-
char* path=argv[1];
-
path=str_contact(path,filename->d_name);
-
if(is_dir(path)){
-
printf("%s\t%ld\t目录\n",path,filename->d_ino);
-
}
-
else{
-
printf("%s\t%ld\t文件\n",path,filename->d_ino);
-
}
-
}
-
closedir(dp);
-
return 0;
-
}
-
阅读(846) | 评论(0) | 转发(0) |