C언어

[APR] file-system directory handling

고요한하늘... 2009. 1. 30. 17:00

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