代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#define MAX_PATH 1024
//dirwalk: apply fcn to all files in dir
/*递归遍历目录*/
void dirwalk(char *dir, void (*fcn)(char *))
{
char name[MAX_PATH];
struct dirent *dp;
DIR *dfd;
if ((dfd = opendir(dir)) == NULL) {
fprintf(stderr, "dirwalk:can not open %s\n", dir);
return;
}
while ((dp = readdir(dfd)) != NULL) {
if ((strcmp(dp->d_name, ".") == 0) || (strcmp(dp->d_name, "..") == 0))
continue; //skip self and parent
if (strlen(dir)+strlen(dp->d_name)+2 > sizeof(name)) {
fprintf(stderr, "dirwalk: name %s %s too long\n", dir, dp->d_name);
} else {
sprintf(name, "%s/%s", dir, dp->d_name);
(*fcn)(name);
}
}
closedir(dfd);
}
//fsize: print the size and name of the file "name"
void fsize(char *name)
{
struct stat st_buf;
if (stat(name, &st_buf) != 0) { //通过文件名name获取文件信息,并保存在st_buf所指的结构体stat中
fprintf(stderr, "fsize:can not access to %s\n", name); //返回值:执行成功则返回0,失败返回-1,错误代码存于errno
return;
}
if ((st_buf.st_mode & S_IFMT) == S_IFDIR) {
dirwalk(name, fsize);
}
printf("%8ld %s\n", st_buf.st_size, name);
}
int main(int argc, char *argv[])
{
if (argc == 1) //default: current dir
fsize(".");
else
while (--argc > 0)
fsize(*++argv);
return 0;
}
运行效果如下:
当前目录下
任意指定目录