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 :

    File 속성 정보 및 파일 관리 Library

    Directory 정보 조회 및 관리 Library

    System Call File I/O Library

    Stream File I/O Library

 

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요