stat, lstat用以判斷文件屬性(link?direcotry?or other?)數據結構
opendir, readdir用以遍歷目錄code
主要數據結構struct dirent, DIR, struct statstring
/** * traverse_dir.c * * traverse a directory, print out all its subdirectories and their contents **/ #include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <errno.h> void printdir(const char *dir, int depth) { assert(depth >= 0); assert(dir != NULL); DIR *dp; struct dirent *entry; struct stat statbuf; if ((dp = opendir(dir)) == NULL) { fprintf(stderr, "cannot open diretory [%s]: %s\n", dir, strerror(errno)); return; } chdir(dir); while ((entry=readdir(dp)) != NULL) { lstat(entry->d_name, &statbuf); if (S_ISDIR(statbuf.st_mode)) { /* Found a directory, ignore . and .. */ if (strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0) { continue; } else else { printf("%*s%s/\n", depth, " ", entry->d_name); printdir(entry->d_name, depth+4); } } else /* entry not a directory */ { printf("%*s%s\t", depth, " ", entry->d_name); if (S_ISLNK(statbuf.st_mode)) printf("\033[40;31;1mLink\033[0m\n"); else printf("\n"); } } chdir(".."); closedir(dp); } int main(int argc, char *argv[]) { assert(argc == 2); const char *dirpath = argv[1]; printdir(dirpath, 0); exit(EXIT_SUCCESS); }