|
发表于 2003-2-20 10:42:54
|
显示全部楼层
用nftw的tree实现:
有些地方还是不能让人满意,写了一个opendir+readdir+stat的递归实现,原来写过的,今天老是搞不好,昨天晚上没睡觉,估计是头晕的缘故,这个就将就一下吧.
#include <stdio.h>
#include <unistd.h>
#include <libgen.h>
#define __USE_XOPEN_EXTENDED 1
#include <ftw.h>
int printent(const char *, const struct stat *, int, struct FTW *);
int
main(int argc, char *argv[])
{
if(argc < 2){
printf("Usage: %s directory\n", argv[0]);
exit(-1);
}
if(nftw(argv[1], printent, 500, FTW_MOUNT | FTW_PHYS) != 0){
printf("\nnftw error.\n");
exit(-1);
}
exit(0);
}
int
printent(const char *file, const struct stat *st, int flag, struct FTW *s)
{
char *vline, *name, *f, lk[255];
int i, fd;
vline = (char *)malloc(s->level * 2 + 1);
strcpy(vline, "|");
for(i = 0; i < s->level - 1; i++)
strcat(vline, " |");
strcat(vline, "-");
f = (char *)malloc(strlen(file) + 1);
strcpy(f, file);
name = basename(f);
if(S_ISREG(st->st_mode))
printf("%s%s\n", vline, name);
else if(S_ISCHR(st->st_mode))
printf("%s%s (Character device)\n", vline, name);
else if(S_ISBLK(st->st_mode))
printf("%s%s (Block device)\n", vline, name);
else if(S_ISFIFO(st->st_mode))
printf("%s%s (FIFO)\n", vline, name);
else if(S_ISSOCK(st->st_mode))
printf("%s%s (SOCKET)\n", vline, name);
else if(S_ISLNK(st->st_mode)){
printf("%s%s -> ", vline, name);
if((i = readlink(file, lk, 255)) == -1)
perror("error");
else{
lk = '\0';
printf("%s\n", lk);
}
}else if(S_ISDIR(st->st_mode))
printf("%s%s\n", vline, name);
free(vline);
free(f);
return(0);
} |
|