본문 바로가기
공부/기타

[리눅스]디렉토리 내부에 있는 파일들의 목록을 출력하는 프로그램

by Ohming 2011. 11. 1.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
컴퓨터 내부에서는 디렉토리도 하나의 파일로 간주합니다.
해당 엔트리가 디렉토리인지 파일인지 엔트리 속성(Attribute)에 저장되어 있습니다.
디렉토리명 문자열과 depth을 printdir()함수에 넘겨주면, 해당 디렉토리 내부에 있는
파일들의 목록을 출력하는 프로그램입니다.

파일목록을 출력하는 도중에 디렉토리가 나올때는
재귀호출을 이용하여 해당 디렉토리 내부에 있는 파일들도 출력하도록
프로그래밍되어 있습니다.

아래 소스의 주석을 참고하세요 ....... ^^


///////////////////////////////
// 선행처리 지시자
#include <stdio.h>
#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <stdlib.h>


///////////////////////////////
// 함수 정의부
void printdir(char* dir, int depth)
{
DIR* dp; // 구조체 DIR의 포인터 변수
struct dirent *entry; // 구조체 dirent(디렉토리 엔트리) 포인터 변수
struct stat statbuf; // 구조체 stat 버퍼 변수
if(!(dp=opendir(dir))) // 문자열 dir로 디렉토리 열기에 실패하면
{
fprintf(stderr, "cannot open directory: %s\n", dir); // 오류메시지 출력
return; // 함수 종료
}
chdir(dir); // 문자열 dir에 저장되어있는 디렉토리로 이동

// dp에 저장된 디렉토리 엔트리를 읽어들여 entry에 저장
// 저장된 값이 참인 동안 실행
while(entry = readdir(dp))
{
lstat(entry ->d_name, &statbuf); // entry에 저장된 디렉토리명을 상태 버퍼에 저장
if(S_ISDIR(statbuf.st_mode)) // 상태버퍼의 모드 값을 검사하였는데, 디렉토리이면
{
if(!strcmp(".", entry ->d_name) || !strcmp("..", entry ->d_name)) // 문자열이 '.' 또는 '..'이면
continue; // 다음 엔트리 읽어들이기
// 디렉토리나 파일이면
printf("%*s%s/\n", depth, "", entry->d_name); // 디렉토리 depth와 디렉토리명을 출력
printdir(entry->d_name, depth+4); // 디렉토리명으로 재귀호출
}
else // 디렉토리가 아니고 파일이면
printf("%*s%s\n", depth, "", entry->d_name); // depth와 파일명을 출력
}
chdir(".."); // 이전 디렉토리로 이동
closedir(dp); // dp에 열려있는 디렉토리 닫기
}


///////////////////////////////
// 메인함수 정의부
int main(void)
{
printf("Directory scan of /home/neil: \n");
printdir("/home/neil", 0); // 디렉토리 출력 함수 호출
printf("done.\n");

return EXIT_SUCCESS; // 프로그램 정상 종료
}

댓글