Unix编程入门之递归遍历目录

假期读了久负盛名的APUE(Advanced Programming in the UNIX Environment),确切的说是读了几页……发现这本书虽然名为高级编程,但是对基础知识的讲解还是挺详细的。大概老外的书就有这么个好处吧……

全书的第一个程序就是列出指定目录下的所有文件和目录。书上的程序只列出了当前目录,不会递归的遍历子目录。于是我就照葫芦画瓢,写了个递归,深度优先的列出子目录。

写这篇文章主要也是要纪念一下,纪念自己写的第一个UNIX环境下的程序。用vim编辑,敲编译参数编译,用gdb命令行调试,确实与在Windows下用图形化的IDE不同的体验。

最后附上程序。我的环境是Mac OS X 10.6.6,Linux环境下应该也可以运行,吧~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <sys/types.h>
#include <dirent.h>
#include <cstdio>
#include <cstring>
void dfs(char *fileName, int indent = -1)
{
DIR *dp;
struct dirent *dirp;
char fn[500];
indent++;
if((dp = opendir(fileName)) == NULL) return;
while((dirp = readdir(dp)) != NULL)
{
if(dirp -> d_name[0] == '.') continue;
for(int i = 0; i < indent; i++) printf(" ");
printf("%s\n", dirp -> d_name);
sprintf(fn, "%s/%s", fileName, dirp->d_name);
dfs(fn, indent);
}
}
int main(int argc, char *argv[])
{
DIR *dp;
if(argc != 2)
{
printf("A single argument is required\n");
return 0;
}
if((dp = opendir(argv[1])) == NULL)
{
printf("Can't open %s\n", argv[1]);
return 0;
}
closedir(dp);
dfs(argv[1]);
return 0;
}

版权声明

The Bloom of Youth by KUANG Qi is licensed under a Creative Commons BY-NC-ND 4.0 International License.
况琪创作并维护的锦瑟华年博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证

本文首发于The Bloom of Youth | 锦瑟华年博客( http://kuangqi.me ),版权所有,侵权必究。

本文永久链接:http://kuangqi.me/programming/directories-traversing-on-unix/