ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Develop] Unix내 파일 및 디렉토리 내의 모든 크기 알아오기
    Mhwan's Develope/C Languge 2020. 1. 2. 23:05

    결과

     

    ## 기능

     - Unix의 명령어 중 du -h와 같은 결과가 나옴

     - 프로그램 실행시 매개변수로 폴더이름 및 파일이름을 넣어 실행하면 파일이면 파일의 크기를 출력, 폴더면 폴더 안에 있는 폴더를 하나하나 탐색하며 각 폴더 별 용량을 구해서 보여주고 총 용량을 보여줌

     

    ## 간단 설명 및 알고리즘 

     - 유닉스는 디렉토리를 열면 readDir을 통해 dit 구조체에 디렉토리의 정보를 저장, 디렉토리 내 파일 등의 정보를 각각의 inode에 저장하므로 lstat함수를 통해 심볼링 링크를 사용해 접근하고 st.st_size로 inode에 있는 크기를 알아옴

     - 디렉토리 내의 파일이면 위 방법으로 파일 크기를 누적하고, 디렉토리면 재귀함수로 해당 디렉토리를 탐색 후 해당 디렉토리의 전체크기를 반환 후 자신을 호출한 디렉토리에 누적 크기에 크기를 더함

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
    #include <string.h>
     
    int searchDirectory(char* dirname){
            struct dirent *dit;
            struct stat st;
            DIR *dir;
            double totalSize = 0;
            double size = 0;
            double dirsize = 0;
            char path[256];
     
            if((dir = opendir(dirname))==NULL) {
                    perror("Error");
                    exit(1);
            }
            while((dit = readdir(dir))!=NULL) {
                    sprintf(path, "%s/%s", dirname, dit->d_name);
                    if(lstat(path, &st)<0)
                            continue;
                    if(strcmp(dit->d_name, "."== 0 || strcmp(dit->d_name, "..")==0)
                            continue;
                    else
                            size = getKbSize((int)st.st_size);
     
                    if(S_ISDIR(st.st_mode)) {
                            dirsize = searchDirectory(path);
                            getFileSize((int) dirsize);
                            printf("\t%s\n", path);
                            totalSize +=dirsize;
                    } else {
                            totalSize += size;
                    }
            }
            return totalSize+1;
    }
    cs

    해당 searchDirectory 함수는 재귀함수의 형태

     

    ##링크

     - Github : https://github.com/mhwan/DirectorySize

     

    mhwan/DirectorySize

    this is getting directory size(with every sub directories) in Unix - mhwan/DirectorySize

    github.com

     

    'Mhwan's Develope > C Languge' 카테고리의 다른 글

    [Develop] Unix Shell 기능 구현  (1) 2020.01.02

    댓글

Designed by Mhwan.