7. file-system directory handling
파일 시스템 디렉토리를 다룰때, 먼저 apr_dir_open()를 사용해야 한다. apr_dir_open()함수로 apr_dir_t오브젝트를 얻는다. apr_dir_read()로 apr_dir_t를 가지로 디렉토리를 스캔할수 있다. 디렉토리를 닫기 위해서는 apr_dir_close()를 호출한다. 프로토 타입을 보면
apr_status_t apr_dir_open(apr_dir_t **new_dir, const char *dirname, apr_pool_t *pool);
apr_status_t apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, apr_dir_t *thedir);
apr_status_t apr_dir_close(apr_dir_t *thedir);
apr_dir_open()의 첫번째 아규먼트는 결과값이다. 이 함수로 apr_dir_t 오브젝트를 생성할수 있다.두번째 아규먼트는 디렉토리명이고, 세번째 아규먼트는 사용할 메모리플이다.
apr_dir_read()의 첫번째 아규먼트는 결과값이다. 앞에서 언급했듯이 apr_finfo_t은 complete type이다. 그러므로 메모리를 명시적으로 할당받아야 한다. apr_dir_read()는 apr_finfo_t에 의해 디렉토리전체를 리턴한다. 그 안에 있는 정보는 파일과 디렉토리이다. 두번째 아규먼트는 bit-wised 플래그이다. 그 플래그는 apr_file_info.h에 APR_FINFO_라는 접두사가 붙은 형태로 APR_FINFO_SIZE, APR_FINFO_TYPE, APR_FINFO_NAME등과 같이 정의되어 있다. 세번째 아규먼트는 apr_dir_t는 스캔할 오브젝트이다.
샘플코드를 보면
/* pseudo code about apr_dir_read() */
/* no error checks */
apr_pool_t *mp;
apr_pool_create(&mp, NULL);
const char *dirpath = "/home";/* directory path to scan */
apr_dir_t *dir;
apr_dir_open(&dir, dirpath, mp);/* create the apr_dir_t object */
apr_finfo_t dirent;
apr_dir_read(&dirent, APR_FINFO_DIRENT, dir);/* the apr_finfo_t object filled */
/* dirent is the first entry of the directory.
* the entry is either file or directory. */
apr_dir_close(dir);
위에서 보면 샘플코드를 보면 apr_dir_read()를 한번 호출한다. 그러나 보통은 apr_dir_read()를 디렉토리아래에서 모든 파일을 스캔하기 위해 여러번 호출한다.
APR_SUCCESS를 리턴하는 동안 모든 파일을 스캔하기 위해서느 apr_dir_read()를 호출한다. 간단한 사용법은 dir-sample.c를 봐라
/* pseudo code about apr_dir_read() loop. error checks omitted */
/* typical while loop of apr_dir_read() */
apr_dir_open(&dir, dirpath, mp);
while ((apr_dir_read(&dirent, APR_FINFO_NAME, dir)) == APR_SUCCESS) {
printf("file name is %s\n", dirent.name);
}
apr_dir_close(dir);
알다시피 apr_dir_t 오브젝트는 현재 위치이다. apr_dir_read()함수 호출은 포지션을 앞으로 이동시킨다. apr_dir_rewind()는 뒤로 이동할수 있다. 모든 오퍼레이션은 이 두가지로 할수 있다.
dir-sample.c에서 보시다시피, 재귀적으로 디렉토리를 순회할려면 apr_dir_open()을 재귀적으로 호출해라
주의 : 유닉스에서 apr_dir_read()은 apr_file_t::fname이 NULL인 apr_finfo_t 오브젝트를 리턴한다.
'C언어' 카테고리의 다른 글
대용량 검색을 위한 TRIE 업그레이드 (0) | 2009.03.26 |
---|---|
[APR] character string handling (0) | 2009.01.30 |
[APR] file lock (0) | 2009.01.30 |
warning assignment makes pointer from integer without a cast (0) | 2009.01.30 |
[APR] Container APIs (0) | 2009.01.29 |