网上搜到的结果大都不令人满意,这里综合了网上的结构,做了小许改动.希望对大家有帮助.
在Linux下的目录结构操作基本上使用opendir,readdir,closedir就够了.
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
int trave_dir(char* path)
{
DIR *d;//声明一个句柄
struct dirent *ent;//readdir函数的返回值就存放在这个结构体中
struct stat sb;
char childpath[512] = {'\0'};//拼凑下一级目录的全路径
if(!(d = opendir(path)))
{
printf("error opendir %s!!!\n",path);
return -1;
}
while((ent = readdir(d)) != NULL)
{
//把当前目录.,上一级目录..及隐藏文件都去掉,避免死循环遍历目录
if(strncmp(ent->d_name, ".", 1) == 0)
continue;
//判断该文件是否是目录
if(ent->d_type & DT_DIR){
memset(childpath, '\0', sizeof(childpath));
char* format = path[strlen(path)-1]=='/'?"%s%s":"%s/%s";
snprintf(childpath, 512, format, path, ent->d_name);
printf("[dir]%s\n", childpath);
trave_dir(childpath);
}else{
printf("\t%s\n", ent->d_name);
}
}
closedir(d);
return 0;
}
int main(int argc, char* argv[])
{
if(argc != 2){
printf("Usage: %s <path>\n", argv[0]);
return 0;
}
trave_dir(argv[1]);
return 0;
}
主要特点:
(1)只需要一个入参,即指定要遍历目录树的顶层目录,并会自动判断末尾是否含有"/"
(2)目录树的打印只在函数内部实现,不会用到相关动态内存分配
(3)从readdir中返回的Dir结构就可以判断这层目录是目录还是真正的文件,不需要使用stat等函数来额外判断
使用方法:
gcc -g readdir_demo.c -o readdir_demo
./readdir_demo "/home/taoyx"或是
./readdir_demo "/home/taoyx/"
代码运行截图
Linux自动清理N天前目录文件:http://www.linuxdiyf.com/linux/11361.html