返回顶部

收藏

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;
}

标签:ls,linux,C++

收藏

0人收藏

支持

0

反对

0

相关聚客文章
  1. cstriker1407 发表 2017-12-12 08:05:38 【转】编译器 cc、gcc、g++、CC 的区别
  2. mirsking 发表 2015-02-11 06:00:00 SIGNALS IN LINUX
  3. CppLive 发表 2012-06-14 10:32:41 单元测试框架CppTest
  4. Ankit Asthana 发表 2016-11-08 08:33:37 Developing Linux C++ applications with Azure Docke
  5. liushenming 发表 2015-03-13 15:10:59 Linux 命令行解析之getopt方法详解
  6. CppLive 发表 2013-06-24 14:52:04 MAC跟Linux下Android交叉编译环境搭建
  7. Potato 发表 2013-06-14 07:39:18 C++对Posix线程API进行封装
  8. espace 发表 2015-05-17 06:47:09 2015年华为上机实习(济南)
  9. Marc Goodner - MSFT 发表 2017-05-10 19:01:04 Linux C++ improvements for cross-platform code sha
  10. Gavin 发表 2013-12-06 03:00:02 利用Graphviz 画结构图
  11. csslayer 发表 2017-12-06 00:48:24 最近踩的一个关于 std::unique_ptr 的小坑。
  12. bbiao 发表 2016-01-12 12:50:57 mktime之夏令时

发表评论