디렉터리내의 파일 크기를 계산하기 위함 함수입니다.
살다보면, 디렉터리내의 파일 용량 크기를 확인해야될 필요가 있죠. 물론, 크기도 확인해야할 필요가 있지만요..
재귀 함수를 이용하고 있으므로, 누적은 전역변수를 이용하였습니다. 리눅스에서 이야기하는 현재 디렉터리 (./)에 대해서는 제외하였으므로, 디렉터리 사이즈 4096만큼 최종 누계에서 합해줘야 하고, 디렉터리인 경우 크기를 별도 계산하지 않으므로, 디렉터리 개수만큼 4096바이트를 더하면.. 최종 크기가 됩니다.
소스보시면 이해되실거라 생각되네요.
출처 : embeddedclub.net
1. 소스 확인
calc_dir()은 사용자로부터 받은 디렉터리 문자열을 기준으로 파일시스템 정보에 있는 하위 디렉터리를 재귀함수를 통해 파일테이블이 끝날 때까지 용량을 합산한다. 합산된 용량은 printf()를 이용하여 출력한다.
// Embeddedclub.net Sample Code
// Auth : embeddedclub.net
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <sys/stat.h>
#include <string.h>
unsigned long calc=0;
unsigned int dircnt=0;
void calc_dir(const char *name, int level);
int main(int argc, char** argv)
{
if(argc!=2) {
printf("Illegal Argument.\n");
return -1;
}
calc_dir(argv[1], 0);
printf("Size = %ld Dir count = %d (%ld), Full Size : %ld\n",calc,dircnt,calc+\
(dircnt*4096),calc+(dircnt*4096)+4096);
return 0;
}
void calc_dir(const char *name, int level)
{
DIR *dir;
struct dirent *entry;
struct stat buf;
if (!(dir = opendir(name)))
return;
if (!(entry = readdir(dir)))
return;
do {
if (entry->d_type == DT_DIR) {
char path[1024];
int len = snprintf(path, sizeof(path)-1, "%s/%s", name, entry->d_name);
path[len] = 0;
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
dircnt++;
calc_dir(path, level + 1);
} else {
stat(entry->d_name, &buf);
calc += buf.st_size;
}
} while (entry = readdir(dir));
closedir(dir);
}
2. 실행결과
아래의 결과에서 Size는 파일의 크기 합계, 디렉터리 없음, 현재 디렉터리 가가지는 정보의 값 까지 더하면 전체 크기가 됩니다.
반응형
최근댓글