Fundamental of Software Develop/: : Linux System Programming

디렉터리 내용 읽기

Jay.P Morgan 2023. 11. 9. 23:58

  디렉터리 내용 읽기

  디렉터리의 내용을 읽으려면 해당 디렉터리를 열고 정보를 읽을 수 있어야 한다.

  디렉터리 열기 : opendir()

  - opendir() 함수는 인자로 지정된 디렉터리를 열고 해당 디렉터리에 대한 디렉터리 스트림을 생성, 이 스트림의 포인터를 리턴한다.

#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);

  name : 열고자 하는 디렉터리 명

 

  DIR 객체(opendir() 함수가 디렉터리 열기에 성공하면 반환하는)에는 열린 디렉터리에 정보가 있으며, dirent.h 파일에 typedef struct__dirstream DIR로 정의되어있다. opendir() 함수는 실패하면 NULL을 반환한다.

 

  디렉터리 닫기 : closedir()

  - 인자로 지정한 DIR 객체가 가리키는 디렉터리를 닫는다.

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

int closedir(DIR *dirp);

   dirp : 닫으려는 디렉터리를 가리키는 포인터

 

  디렉터리를 닫는데 성공하면 0을, 실패하면 -1을 반환한다. 

 

  디렉터리 내용 읽기 : readdir()

  - 인자로 지정한 DIR 객체가 가리키는 디렉터리의 내용을 한 번에 하나씩 읽는다. 더 이상 읽을 것이 없으면 NULL을 반환한다.

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

  dirp : 정보를 읽어올 디렉터리를 가리키는 DIR 객체

 

  readdir() 함수는 디렉터리에 있는 항목의 정보를 가리키는 dirent 구조체의 포인터를 반환한다.

 (dirent 구조체는 sys/dirent.h 파일에 정의되어있음)

struct dirent{
    ino_t		d_ino;
    off_t		d_off;
    unsigned short	d_reclen;
    unsigned char	d_type;
    char		d_name[256];
};

  d_ino : 해당 항목의 inode 번호, d_off : 디렉터리 오프셋의 위치, d_reclen : 해당 항목의 레코드 길이, d_type : 파일 종류, d_name: 항목 이름

 

 

※ 10 : 현재 디렉터리 열기 / 12~15 : 현재 디렉터리의 파일이름과 inode를 출력

 

※ 현재 디렉터리의 파일명과 inode가 출력되었다.

 

 

 

  디렉터리의 오프셋 이동 : telldir() / seekdir() / rewinddir()

  디렉터리를 열고 내용을 읽으면, 디렉터리 스트림에서 현재 내용을 읽고 있는 위치를 나타내는 오프셋 값이 이동한다.

  오프셋의 현재 위치를 읽고 옮기는 함수로 telldir(), seekdir(), rewinddir() 이 있다.

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

long telldir(DIR *dirp);
void seekdir(DIR *dirp, long loc);
void rewinddir(DIR *dirp);

 

    - telldir() : 인자가 가리키는 디렉터리 스트림에서 현재 위치를 반환하며, 실패하면 -1을 반환한다.

    - seekdir() : 디렉터리 스트림에서 readdir() 함수가 다음 항목을 읽을 수 있는 곳으로 오프셋을 옮긴다. [인자 loc: telldir() 반환값]

    - rewinddir() : 디렉터리 스트림의 위치를 시작 지점으로 옮긴다.

 

 

※ 디렉터리 스트림의 시작 위치는 0이며, 항목을 읽을 때 마다 위치가 바뀌는 것을 알 수 있다.