Linux C 遍历指定目录

时间:2022-09-23 12:41:23
#include<stdio.h>    //标准输入输出
#include<unistd.h> //各种系统调用
#include<dirent.h> //与目录有关的操作
#include<string.h> //与字符串处理有关的函数
#include<sys/stat.h> //与文件状态有关
#include<sys/types.h>//linux系统自定义的类型



void show_directory(char * dir_name,int level);
int main(int argc, char * argv[])
{
if(argc != 2)
{
fprintf(stdout,
"%s\n","参数输入有问题!");
return 1;
}
show_directory(argv[
1],0);
return 0;

}

/*用于显示目录
* 第一个参数为目录的名称
* 第二个参数为目录为几及目录
*
*/

void show_directory(char * dir_name,int level)
{
DIR
* dir; //目录流指针
struct dirent * entry; //目录项结构体指针
struct stat statbuf;



if( ( dir = opendir(dir_name) ) == NULL )
return ;

chdir(dir_name);

char cwd[100];
getcwd(cwd,
100);

int dir_name_len;
dir_name_len
= strlen(dir_name);
fprintf(stdout,
"%*s文件夹中:\n",level + dir_name_len,dir_name);
while( ( entry = readdir(dir) ) != NULL )
{

lstat(entry
->d_name,&statbuf);
//如果是目录,就第归调用
if( S_ISDIR (statbuf.st_mode) )
{
if( strcmp(".",entry->d_name) == 0 || strcmp("..",entry->d_name) == 0)
{
continue;
}
int level2;
level2
= level + dir_name_len + 10; //计算出空格数
show_directory(entry->d_name,level2);
}
else if( S_ISREG(statbuf.st_mode) ) //如果是文件,输出
{
int length = level + (int)strlen(entry->d_name) + dir_name_len + 10; //子段应有占的长度
fprintf(stdout,"%*s\n",level + (int)strlen(entry->d_name) + dir_name_len + 10,entry->d_name);
}
}
chdir(
"..");
closedir(dir);

}