• 大小: 1KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-11
  • 语言: 其他
  • 标签: tree  

资源简介

linux 目录树实现代码,使用的是递归的算法

资源截图

代码片段和文件信息

/*实现一个tree命令
 :操作目录文件的函数:opendir rewinddir readdir closedir
 :递归函数
 :操作i节点函数:stat
 */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define BUFSZ 4092

void display_tree(char *filenameint level);

int main(int argcchar **argv)
{
char filename[BUFSZ] = {0};

if(argc < 2)
{
//如果没有路径,则自动获取当前路径
getcwd(filenameBUFSZ-1);
}
else
{
//保证传入的目录是绝对路径
if(argv[1][0] == ‘/‘)
{
strcpy(filenameargv[1]);
}
else
{//如果不是绝对路径,把它转换成绝对路径
getcwd(filenameBUFSZ-1);
strcat(filename“/“);
strcat(filenameargv[1]);
}
}

//显示目录文件/逐层显示
display_tree(filename0);

return 0;
}

void display_tree(char *filenameint level)
{
struct stat st;
int reti;
char *file = NULL;
DIR *dir = NULL;
struct dirent *dent = NULL;
char tmp[BUFSZ] = {0};

if(NULL == filename)
{
return ;
}

ret = stat(filename&st);
if(-1 == ret)
{
perror(“stat“);
return ;
}

if(S_ISDIR(st.st_mode))
{//如果是目录文件

/*首先打印当前目录下,所有文件名*/
for(i = 0; i < level; i++)
{
printf(“%c“‘\t‘);
}
file = strrchr(filename‘/‘);
printf(“|--%s\n“file+1);

//打开目录文件
dir = opendir(filename);
if(NULL == dir)
{
perror(“opendir“);
return ;
}
rewinddir(dir);
while(1)
{
dent = readdir(dir);
if(NULL == dent)
{
perror(“readdir“);
return ;
}
if(!strcmp(dent->d_name“.“)||!strcmp(dent->d_name“..“))
{
continue;
}

//转换为绝对路径
strcpy(tmpfilename);
strcat(tmp“/“);
strcat(tmpdent->d_name);

display_tree(tmplevel+1); //递归调用
}

}
else
{//如果不是目录文件
//直接把文件名打印,
for(i = 0; i < level; i++)
{
printf(“|--%c“‘\t‘);
}
file = strrchr(filename‘/‘);
printf(“%s\n“file+1);
}
closedir(dir);
}

#if 0
file = strrchr(filename‘/‘);
:从字符串尾部开始查找,找第一个‘/‘字符指针的位置,并返回
/opt/sz1402/day5/opendir/1.c
#endif

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       2275  2014-04-23 15:23  tree.c

----------- ---------  ---------- -----  ----

                 2275                    1


评论

共有 条评论