mkdir

sesame·2022년 3월 14일
0

교육

목록 보기
41/46

mkdir(2)

디렉토리 생성

#include <sys/stat.h>

int mkdir(const char *path, mode_t mode);

return: 성공시 0, 실패시 -1
path: 생성할 디렉토리 이름
mode: 접근 권한 지정

rmdir(2)

디렉토리 삭제

int rmdir( const char *path);

return: 성공시 0, 실패시 -1
path: 삭제할 디렉토리 이름

rmdirs

UNIX/LINUX에서는 directory를 삭제하는 함수는 rmdir(2)이 있다. 그러나 directory가 비어있지 않으면 삭제할 수 없다.
따라서 directory 및 하위의 모든 directory/파일을 지우기 위해서는 directory의 모든 파일을 검색해서 일일이 파일을 unlink(2)로 삭제하고 파일이 모두 지워지면 디렉토리를 rmdir(2)로 삭제해야 한다.

path가 파일이면 파일을 삭제하고, path가 directory이면 그 하위의 모든 directory와 파일을 삭제

int rmdirs(const char *path, int force)

return: 성공시 0, 실패시 -1
path: 삭제할 디렉토리 이름
force - 삭제시 권한 문제 등으로 파일을 삭제할 수 없다는 파일이 있을 때에 어떻게 할 것인지에 대한 옵션입니다.

0이면 : 최초 오류 발생시 중지
0이 아니면 : 오류가 발생하더라도 나머지는 계속 삭제함

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>

int rmdirs(const char *path, int force)
{
    DIR *  dir_ptr      = NULL;
    struct dirent *file = NULL;
    struct stat   buf;
    char   filename[1024];

    /* 목록을 읽을 디렉토리명으로 DIR *를 return 받습니다. */
    if((dir_ptr = opendir(path)) == NULL) {
		/* path가 디렉토리가 아니라면 삭제하고 종료합니다. */
		return unlink(path);
    }

    /* 디렉토리의 처음부터 파일 또는 디렉토리명을 순서대로 한개씩 읽습니다. */
    while((file = readdir(dir_ptr)) != NULL) {
        // readdir 읽혀진 파일명 중에 현재 디렉토리를 나타네는 . 도 포함되어 있으므로 
        // 무한 반복에 빠지지 않으려면 파일명이 . 이면 skip 해야 함
        if(strcmp(file->d_name, ".") == 0 || strcmp(file->d_name, "..") == 0) {
             continue;
        }

        sprintf(filename, "%s/%s", path, file->d_name);

        /* 파일의 속성(파일의 유형, 크기, 생성/변경 시간 등을 얻기 위하여 */
        if(lstat(filename, &buf) == -1) {
            continue;
        }

        if(S_ISDIR(buf.st_mode)) { // 검색된 이름의 속성이 디렉토리이면
            /* 검색된 파일이 directory이면 재귀호출로 하위 디렉토리를 다시 검색 */
            if(rmdirs(filename, force) == -1 && !force) {
                return -1;
            }
        } else if(S_ISREG(buf.st_mode) || S_ISLNK(buf.st_mode)) { // 일반파일 또는 symbolic link 이면
            if(unlink(filename) == -1 && !force) {
                return -1;
            }
        }
    }

    /* open된 directory 정보를 close 합니다. */
    closedir(dir_ptr);
    
    return rmdir(path);
}

json 파일 쓰기

JSON_Value * json_value_init_object(void)
JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string)
//JSON 객체에 키를 추가하고 문자열을 저장하는 함수

JSON_Status json_object_set_number(JSON_Object *object, const char *name, double number)
//JSON 객체에 키를 추가하고 숫자를 저장하는 함수

JSON_Status json_object_set_boolean(JSON_Object *object, const char *name, int boolean)
//JSON 객체에 키를 추가하고 불 값을 저장하는 함수

JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value)
//JSON 객체에 키를 추가하고 JSON_Value를 저장하는 함수

JSON_Value * json_value_init_array(void)
//JSON 배열을 생성하는 함수

JSON_Status json_array_append_string(JSON_Array *array, const char *string)
//JSON 배열에 문자열 요소를 추가하는 함수

JSON_Status json_serialize_to_file_pretty(const JSON_Value *value, const char *filename)
//JSON_Value를 사람이 읽기 쉬운 문자열(pretty)로 만든 뒤 파일에 저장하는 함수

int main()
{
    JSON_Value *rootValue;
    JSON_Object *rootObject;

    /* 초기화 */
    rootValue = json_value_init_object();             // JSON_Value 생성 및 초기화
    rootObject = json_value_get_object(rootValue);    // JSON_Value에서 JSON_Object를 얻음
    //이렇게 하면 빈 객체 { }가 생성되고, 키를 추가할 수 있는 상태가 된다.
    
    /* 사용 */
    // 객체에 키를 추가하고 문자열 저장
    json_object_set_string(rootObject, "Title", "Inception");
    
    // 객체에 키를 추가하고 숫자 저장
    json_object_set_number(rootObject, "Year", 2010);
    
    // JSON_Value를 사람이 읽기 쉬운 문자열(pretty)로 만든 뒤 파일에 저장
    json_serialize_to_file_pretty(rootValue, "example.json");
    
    /* 해제 */
    json_value_free(rootValue);    // JSON_Value에 할당된 동적 메모리 해제

    return 0;
}

참고
c json
header만큼만 읽기
dir name find

0개의 댓글