(1) 파일 목록 읽어 내기
: 파일 목록을 읽어 내기 위해서는 해당 운영체제가 채택한 파일 시스템에 대해서 알고 있어야 한다. 리눅스나 유닉스 계열의 경우 디렉토리는 특수 파일로, I-노드 번호와 파일명의 쌍을 갖는 구조체의 이루어져 있다. 디렉토리의 구조체에서 I-노드 번호는 I-노드를 찾는 색인(Index)로 사용된다.


(2) I-노드의 파일 정보
- 파일 소유주의 사용자 ID와 그룹ID
- 접근 권한 정보
- 파일 내용이 저장된 물리적인 디스크의 번지
- 파일 크기
- 최근의 I-노드 변경 시각, 최근의 이용 시각, 최근의 갱신 시각
- 해당 파일이 몇 개의 디렉토리로부터 참조되고 있는지 참조 수
- 파일 유형(디렉토리, 일반 파일, 특수 파일)


(3) dirent 구조체
: 헤더파일 dirent.h 에는 디렉토리의 구조를 구조체 dirent로 정의하고 있다.


 struct dirent {
    long                   d_ino;                                   // I-노드 번호 (삭제된 파일은 I-노드번호가 0)
    off_t                   d_off;                                    // offset
    unsigned short    d_reclen;                              // 파일 이름 길이
    char                   d_name[NAME_MAX+1]        // 파일 이름
 }
 


(4) 파일 읽기
디렉토리 파일을 읽어 내려면 단순히 파일을 열어 저장된 구조체를 하나씩 읽으면 된다.

1. 디렉토리 열기 : opendir() 함수


 #include <dirent.h>

 DIR *opendir(const char *dirname);
 
반환값 : 성공(디렉토리 스트림의 포인터), 실패(NULL)
- opendir 함수는 변수 dirname에 지정된 디렉토리 스트림을 열어 처음을 가리킨다.

2. 파일 읽기 : readdir() 함수
 
 #include <dirent.h>

 struct dirent *readdir(DIR *dirp);

반환값 : 성공(파일 정보가 담긴 dirent 구조체), 실패(NULL)
- readdir 함수는 dirp가 가리키는 디렉토리 내 파일 목록의 주소를 반환한다.
- 파일 목록을 알려면 readdir 함수를 반복해서 호출해서 디렉토리 항목을 하나씩 읽으면 된다.

3. 디렉토리 파일 닫기 : closedir() 함수
 
 #include <dirent.h>

 int closedir(DIR *dp);
 
반환값 : 성공(0), 실패(-1)
- closedir 함수는 디렉토리 파일을 닫아준다.


(5) 프로그램 구현



(6) 프로그램 실행



by 민트앤라떼 2013. 11. 13. 02:24