stat, lstat用以判断文件属性(link?direcotry?or other?)
opendir, readdir用以遍历目录
主要数据结构struct dirent, DIR, struct stat
/**
* 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);
}