디렉터리 함수

Juni and ING·2020년 8월 24일
0

열기

#include <sys/types.h>
#include <dirent.h>

DIR *opendir(const char *name);
DIR *fdopendir(int fd);

인자

name : 디렉터리 경로
fd : 파일 디스크립터

반환값

성공 시 : 디렉터리 스트림 포인터
실패 시 : NULL


탐색

Entry 구조체

struct dirent {
    ino_t          d_ino;       /* Inode number */
    off_t          d_off;       /* Not an offset; see below */
    unsigned short d_reclen;    /* Length of this record */
    unsigned char  d_type;      /* Type of file; not supported
                                   by all filesystem types */
    char           d_name[256]; /* Null-terminated filename */
};

d_type 값

  • DT_BLK
    A block device.

  • DT_CHR
    A character device.

  • DT_DIR
    A directory.

  • DT_FIFO
    A named pipe (FIFO).

  • DT_LNK
    A symbolic link.

  • DT_REG
    A regular file.

  • DT_SOCK
    A UNIX domain socket.

  • DT_UNKNOWN
    The file type could not be determined.

함수 정의

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

인자

dirp : 디렉터리 스트림 포인터

반환값

성공 시 : 디렉터리 엔트리 포인터
실패 시 : NULL

사용법

함수를 호출할 때마다 디렉터리 하위 파일들을 차례로 반환한다.
더 이상 반환할 파일들이 없을 때 NULL을 반환한다.


닫기

#include <sys/types.h>
#include <dirent.h>

int closedir(DIR *dirp);

인자

dirp : 디렉터리 스트림 포인터

반환값

성공 시 : 0
실패 시 : -1


Example

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>

#define TYPE2STR(x) \
    (x == DT_BLK)  ? "Block device" :\
    (x == DT_CHR)  ? "Charcter device":\
    (x == DT_DIR)  ? "Directory":\
    (x == DT_FIFO) ? "FIFO":\
    (x == DT_LNK)  ? "Symbolic link":\
    (x == DT_REG)  ? "Regular file":\
    (x == DT_SOCK) ? "Socket":\
                     "Unknown"

static void browse_dir(void)
{
    DIR *dp = NULL;
    struct dirent *entry;

    dp = opendir(".");
    if(dp == NULL){
        perror("opendir() FAIL\n");
        goto EXCEPTION;
    }

    while(true){
        entry = readdir(dp);
        if(entry == NULL){
            break;
        }

        printf("%s: %s\n", entry->d_name, TYPE2STR(entry->d_type));
    }

    closedir(dp);

    return;

EXCEPTION:
    if(dp)  closedir(dp);
    return;
}

int main(int argc, char **argv)
{
    browse_dir();

    return 0;
}
profile
인기는 없지만 그래도 임베디드를 사랑하는 한 개발자

0개의 댓글