- 论坛徽章:
- 0
|
我们将要实现的是要得到一个子目录清单的程序,现在把许多文件处理函数集中在一起使用,程序遍历指定目录的文件,同时也要进到下级子目录中进行遍
历,这一点是将子目录递归传递到opendir中去,需要指出的是,这就决定了如果子目录嵌套过深,程序将失败返回,因为允许打开的子目录流数量是有上限
的。
源码如下:
![]()
![]()
/**//* We start with the appropriate headers and then a function, printdir,
![]()
which prints out the current directory.
![]()
It will recurse for subdirectories, using the depth parameter is used for indentation. */
![]()
![]()
#include unistd.h>
![]()
#include stdio.h>
![]()
#include dirent.h>
![]()
#include string.h>
![]()
#include sys/stat.h>
![]()
![]()
void printdir(char *dir, int depth)
![]()
![]()
![]()
{
![]()
DIR *dp;
![]()
struct dirent *entry;
![]()
struct stat statbuf;
![]()
![]()
![]()
if((dp = opendir(dir)) == NULL)
![]()
{
![]()
fprintf(stderr,"cannot open directory: %s\n", dir);
![]()
return;
![]()
}
![]()
chdir(dir);
![]()
![]()
while((entry = readdir(dp)) != NULL)
![]()
{
![]()
lstat(entry->d_name,&statbuf);
![]()
![]()
if(S_ISDIR(statbuf.st_mode))
![]()
{
![]()
![]()
/**//* Found a directory, but ignore . and .. */
![]()
if(strcmp(".",entry->d_name) == 0 ||
![]()
strcmp("..",entry->d_name) == 0)
![]()
continue;
![]()
printf("%*s%s/\n",depth,"",entry->d_name);
![]()
![]()
/**//* Recurse at a new indent level */
![]()
printdir(entry->d_name,depth+4);
![]()
}
![]()
else printf("%*s%s\n",depth,"",entry->d_name);
![]()
}
![]()
chdir("..");
![]()
closedir(dp);
![]()
}
![]()
![]()
![]()
/**//* Now we move onto the main function. */
![]()
![]()
int main(int argc, char* argv[])
![]()
![]()
![]()
{
![]()
char *topdir, pwd[2]=".";
![]()
if (argc != 2)
![]()
topdir=pwd;
![]()
else
![]()
topdir=argv[1];
![]()
![]()
printf("Directory scan of %s\n",topdir);
![]()
printdir(topdir,0);
![]()
printf("done.\n");
![]()
![]()
exit(0);
![]()
}
从主函数中我们看到,这是一个比较通用的做法:我们将子目录作为参数传递,而缺省则是当前所在子目录。
这是一个目录浏览的小工具,再接再励我们可以完成得更好,比如将文件得更多信息显示出来等等。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/50685/showart_1889606.html |
|