[ CODE ] DIR, FILE

38A·2023년 4월 23일
1

Operating System

목록 보기
13/14
post-thumbnail

✔️ opendir()

#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");

✔️ chdir()

#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;
}

✔️ readdir()

#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);
	}
}

✔️ closedir()

#include <dirent.h>

int closedir(DIR *dir);
return 0, if fail return -1

closedir(dir);

✔️ access()

#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);
}

✔️ mkdir()

#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;
}

✔️ open()

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);

✔️ read()

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);

✔️ write()

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);

✔️ close()

int close(int fd);
return 0, if fail return -1

close(src);
profile
HGU - 개인 공부 기록용 블로그

0개의 댓글