'dirent'에 해당하는 글 1건

linux directory dirent.h

Linux 2010. 12. 5. 23:53
출처 : http://marnitto.edogawa.kr/category/?page=1

C 언어에서 파일을 다루기 위해서는 OS에서 제공하는 API, 이를테면 Windows에서의 CreateFile 등의 함수를 사용해도 됩니다만, 일반적으로 간단한 파일 입출력을 위해서는 FILE * 을 이용합니다. 마찬가지로 디렉토리를 다루기 위해서 C 언어에서는 DIR *과 struct dirent를 사용합니다. 이는 기본적으로 다음 헤더 참조를 통해 사용할 수 있습니다.
#include <dirent.h>

디렉토리를 여는 방법부터 알아보도록 하겠습니다. 디렉토리 열기는 opendir()라는 함수를 통해서 사용 가능합니다.
DIR * opendir(char const *path);
path 안에는 경로를 넣으면 됩니다. 리턴값은 에러가 발생했다면 NULL, 그렇지 않으면 DIR * 포인터를 리턴합니다. 파일에서의 fopen과 비슷한 대신에 뒤에 읽기/쓰기 등의 지정이 없다고 생각하시면 됩니다.

디렉토리 안의 파일들을 하나하나 살펴보려면 간단히 readdir라는 함수를 사용하면 됩니다.
struct dirent * readdir(DIR *dp);
dp 에는 opendir를 통해서 열었던 DIR *를 그대로 넘겨주시면 됩니다. 이 함수가 맨 처음 호출되면 디렉토리의 맨 처음에 있는 파일에 관한 정보를 struct dirent 에 담아 리턴합니다. 한 번 더 호출되면 그 다음의 파일에 관한 정보를 읽습니다. 이 작업이 반복되다가 더 이상 읽을 파일이 없다고 판단되면 NULL을 리턴합니다.
struct dirent는 디렉토리 내의 파일에 관한 아주 간단한 정보를 담고 있습니다. struct dirent는 dirent.h에 다음과 같이 정의되어 있습니다(MinGW 기준).
struct dirent
{
long d_ino; /* Always zero. */
unsigned short d_reclen; /* Always zero. */
unsigned short d_namlen; /* Length of name in d_name. */
char d_name[FILENAME_MAX]; /* File name. */
}
일반적으로 d_in나 d_reclen의 경우는 잘 쓰이지 않고, 주로 d_name이 쓰입니다.

디렉토리 내의 파일에 관한 정보를 처음부터 다시 읽고 싶다면 rewinddir 함수를 사용하면 됩니다.
void rewinddir(DIR *dp);
디렉토리가 몇 번째 파일까지 탐색했는지를 알고 싶으면 telldir 함수를 사용하면 됩니다. 이 함수는 디렉토리를 어느 정도까지 읽었는지 그 인덱스를 리턴합니다.
long telldir(DIR *dp);
디렉토리의 탐색 위치를 임의로 변경하고 싶으면 seekdir 함수를 사용하면 됩니다.
void seekdir(DIR *dp, long index);

디렉토리에 대해서 더 이상 작업할 게 없으면 closedir를 통해 정리하면 됩니다.
int closedir(DIR *dp);
이 함수는 성공하면 0, 실패하면 1을 리턴합니다.


간단한 예제로, 현재 디렉토리에 있는 모든 파일을 탐색하는 프로그램을 작성했습니다.
#include <dirent.h>
#include <stdio.h>

int main()
{
DIR *dp;
struct dirent *f;

dp = opendir(".");
if (!dp) return 0;

while (1)
{
f = readdir(dp);
if (!f) break;

printf("[%d] %s\n", telldir(dp), f->d_name);
}

closedir(dp);
return 0;
}



WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,