#include <dirent.h>
DIR *opendir(const char *name);
return DIR 포인터, if fail return NULL
DIR *dir = NULL;
dir = opendir(".");
if(dir == NULL)
fprintf(stderr, "Error! Can not open the directory");
#include <dirent.h>
int chdir(const char *name);
return 0, if fail -1
int chdir_result = chdir(working_dir);
if(chdir_result < 0) {
fprintf(stderr, "Failed to change directory");
return 0;
}
#include <dirent.h>
struct dirent *readdir(DIR *dir);
return 파일 또는 디렉토리의 정보, if fail or EOF return NULL
int stat(const char *path, struct stat *buf);
return 0, if fail return -1
struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* offset to the next dirent */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported by all file system types */
char d_name[256]; /* filename */
};
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* 파일의 종류 및 접근권한 */
nlink_t st_nlink; /* hardlink 된 횟수 */
uid_t st_uid; /* 파일의 owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* 파일의 크기(bytes) */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
struct tm {
int tm_sec; /* 초 - [0~61] */
int tm_min; /* 분 - [0~59] */
int tm_hour; /* 시 - [0~23] */
int tm_mday; /* 일 - [1~31] */
int tm_mon; /* 월 - [0~11] */
int tm_year; /* 1900부터의 년 */
int tm_wday; /* 일요일부터의 요일 - [0~6] */
int tm_yday; /* 년초부터의 통산 일수 - [0~365] */
int tm_isdst; /* 서머 타임이 유효하면 양수, 유효하지 않으면 0, 불명이면 음수*/
};
struct dirent *ent = NULL;
while((ent = readdir(dir)) != NULL) {
struct stat statbuf;
struct tm *date;
// error handling
if(stat(ent->d_name, &statbuf) < 0)
fprintf(stderr, "Stat error!\n");
time_t mtime = statbuf.st_mtime;
date = localtime(&mtime);
printf("%s, uid = %d, gid = %d, size = %ld,
modified date = %d/%02d/%02d\n", ent->d_name, statbuf.st_uid,
statbuf.st_gid, statbuf.st_size, date->tm_year+1900,
date->tm_mon+1, date->tm_mday);
}
}
#include <dirent.h>
int closedir(DIR *dir);
return 0, if fail return -1
closedir(dir);
#include <unistd.h>
int access(const char *pathname, int mode);
return 0, if fail return -1
➕ Parameter
mode
: mask
- R_OK : 파일 존재 여부, 읽기 권한 여부
- W_OK : 파일 존재 여부, 쓰기 권한 여부
- X_OK : 파일 존재 여부, 실행 권한 여부
- F_OK : 파일 존재 여부
if(access(src_path, R_OK) != 0){
fprintf(stderr, "Error! File does not exist or is not readible!\n");
exit(-1);
}
#include <unistd.h>
int mkdir(const char *pathname, mode_t mode);
return 0, if fail return -1
if(mkdir(subdir, 0766) != 0) {
fprintf(stderr, "Error! directory creation error\n");
return FALSE;
}
int open(const char *pathname , int flags , mode_t mode);
return fd ( positive # ), if fail return -1
➕ Parameter
flags
: 파일을 어떤 방식으로 열것인지 선택
- O_RDONLY : 읽기 전용
- O_WRONLY : 쓰기 전용
- O_RDWR : 읽기 , 쓰기 모두
- O_CREAT : 파일없을 경우 파일 생성
- O_EXCL : 파일 존재시 error 리턴
int src = open(src_path, O_RDONLY, 0);
ssize_t read (int fd, void *buf, size_t nbytes);
return readsize, if fail return -1
#define BUFFER_SIZE 512
static char buffer[BUFFER_SIZE];
ssize_t read_size = 0;
read_size = read(src, buffer, BUFFER_SIZE);
ssize_t write (int fd, const void *buf, size_t n);
return writesize, if fail return -1
ssize_t written_size = 0;
written_size = write(dest, buffer, read_size);
int close(int fd);
return 0, if fail return -1
close(src);