C++仿linux ls命令的实现代码
#include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <sys/stat.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <unistd.h> int count_file_size(const char *dirname); unsigned long file_size = 0; int main(int argc, char **argv) { count_file_size(argv[1]); return 0; } int count_file_size(const char *dirname) { DIR *dp; struct dirent *dirp; struct stat buf; char string[256]; int length = strlen(dirname); bzero(string, 256); snprintf(string, length + 1, "%s", dirname); if ( (dp = opendir(dirname)) == NULL) { fprintf(stderr, "Can't open dir %s\n", dirname); exit(1); } while ( (dirp = readdir(dp) ) != NULL) { if ( (strcmp(dirp->d_name, ".") == 0) || (strcmp(dirp->d_name, "..") == 0) ) continue; #if 0 if (dirp->d_type == DT_DIR) { printf("%s\n", dirp->d_name); continue; } #endif snprintf(&string[length], strlen(dirp->d_name) + 1, "%s", dirp->d_name); if (lstat(string, &buf) < 0) { fprintf(stderr, "Get file stat falied: %s\n", strerror(errno)); continue; } if (S_ISREG(buf.st_mode)) printf("-"); else if (S_ISDIR(buf.st_mode)) printf("d"); else if (S_ISCHR(buf.st_mode)) printf("c"); else if (S_ISBLK(buf.st_mode)) printf("b"); else if (S_ISFIFO(buf.st_mode)) printf("p"); else if (S_ISLNK(buf.st_mode)) printf("l"); else if (S_ISSOCK(buf.st_mode)) printf("s"); else continue; printf("\t\t%-8lu\t\t%s\n", buf.st_size, dirp->d_name); } closedir(dp); return 0; }