#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
DIR *fdopendir(int fd);
name : 디렉터리 경로
fd : 파일 디스크립터
성공 시 : 디렉터리 스트림 포인터
실패 시 : NULL
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 */
};
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
#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;
}