C++仿linux ls命令的实现代码
#include
#include
#include
#include
#include
#include
#include
#include
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;
}
开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明C++仿linux ls命令的实现代码!