資源簡介
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? {
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? {
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
評論
共有 條評論