반응형
opendir(3) / fdopendir(3)
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
DIR *fdopendir(int fd);
특정 directory의 하위에 있는 파일명 및 디렉토리명 등의 목록을 얻기 위한 DIR *를 생성합니다.
opendir(3)은 full path 또는 현재 디렉토리의 상대 path의 이름으로 DIR *를 생성합니다. fdopendir(3)은 directory 정보를 얻기 위하여 open(2)을 통하여 열려진 fd를 통하여 DIR *를 생성합니다. 주로 opendir(3)을 사용합니다.
파라미터
name
- directory 정보를 얻고 싶은 directory명
- directory명은 full path 또는 상대 Path
fd
- open(2)을 통하여 생성된 file descriptor
- open(2)은 file뿐만 아니라 directory도 open할 수 있습니다.
RETURN
NULL이 아닌 값
- 정상적으로 DIR *를 생성되었습니다.
- DIR *는 마치 FILE *와 비슷합니다. FILE *는 파일의 데이터를 읽기 위한 용도라면
DIR *는 디렉토리 하위에 있는 파일 또는 디렉토리명을 얻기 위해 생성합니다.
NULL
- 오류가 발생하였으며, 상세한 오류 내용은 errno에 저장됩니다.
- EACCES : 디렉토리에 대한 읽을 권한이 없습니다.
- EBADF : fd는 유효한 file descriptor가 아닙니다.
- EMFILE : 너무 많은 file descriptor가 열려있습니다.
- ENOENT : 디렉토리가 존재하지 않습니다.
- ENOMEM : 메모리 부족.
- ENOTDIR : name parameter는 디렉토리가 아닙니다.
활용 예제
Sample). 로그인한 home directory의 전체 파일 목록 출력
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
int main(int argc, char **argv)
{
DIR *dir_ptr = NULL;
struct dirent *file = NULL;
char home[1024];
strncpy(home, getenv("HOME"), sizeof(home));
/* 목록을 읽을 디렉토리명으로 DIR *를 return 받습니다. */
if((dir_ptr = opendir(home)) == NULL)
{
fprintf(stderr, "%s directory 정보를 읽을 수 없습니다.\n", home);
return -1;
}
/* 디렉토리의 처음부터 파일 또는 디렉토리명을 순서대로 한개씩 읽습니다. */
while((file = readdir(dir_ptr)) != NULL)
{
/*
* struct dirent *의 구조체에서 d_name 이외에는
* 시스템마다 항목이 없을 수 있으므로 무시하고 이름만 사용합니다.
*/
printf("%s\n", file->d_name);
}
/* open된 directory 정보를 close 합니다. */
closedir(dir_ptr);
return 0;
}
see also :
반응형
'C언어 header > dirent.h' 카테고리의 다른 글
seekdir(3) - 다음 읽을 위치를 지정함 (0) | 2019.09.23 |
---|---|
scandir(3) - 디렉토리에 존재하는 파일 및 디렉토리 전체 목록 조회 (0) | 2019.09.23 |
rewinddir(3) - 디렉토리 정보 읽기 위치를 처음으로 이동 (0) | 2019.09.23 |
readdir(3) - 디렉토리 소속의 파일정보를 읽음 (0) | 2019.09.23 |
closedir(3) - 디렉토리 검색 종료 (0) | 2019.09.23 |