-
[Develop] Unix내 파일 및 디렉토리 내의 모든 크기 알아오기Mhwan's Develope/C Languge 2020. 1. 2. 23:05
## 기능
- Unix의 명령어 중 du -h와 같은 결과가 나옴
- 프로그램 실행시 매개변수로 폴더이름 및 파일이름을 넣어 실행하면 파일이면 파일의 크기를 출력, 폴더면 폴더 안에 있는 폴더를 하나하나 탐색하며 각 폴더 별 용량을 구해서 보여주고 총 용량을 보여줌
## 간단 설명 및 알고리즘
- 유닉스는 디렉토리를 열면 readDir을 통해 dit 구조체에 디렉토리의 정보를 저장, 디렉토리 내 파일 등의 정보를 각각의 inode에 저장하므로 lstat함수를 통해 심볼링 링크를 사용해 접근하고 st.st_size로 inode에 있는 크기를 알아옴
- 디렉토리 내의 파일이면 위 방법으로 파일 크기를 누적하고, 디렉토리면 재귀함수로 해당 디렉토리를 탐색 후 해당 디렉토리의 전체크기를 반환 후 자신을 호출한 디렉토리에 누적 크기에 크기를 더함
123456789101112131415161718192021222324252627282930313233343536373839#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;elsesize = 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's Develope > C Languge' 카테고리의 다른 글
[Develop] Unix Shell 기능 구현 (1) 2020.01.02