mkdirs - 계층구조의 디렉토리 한번에 만들기

C언어에서는 java의 File.mkdirs( )과 같은 함수가 존재하지 않습니다. 2 depth 이상의 디렉토리 구조를 한꺼번에 만들려면 만들려는 최상위 디렉토리부터 하위 디렉토리를 차례대로 존재하는 확인하면서 없으면 만들고 있으면 다음 하위 디렉토리를 검사하는 식으로 해서 최종 디렉토리까지 만들어 가야 합니다. 그래서 한번에 2 depth 이상의 directory를 만드는 것은 귀찮은 일입니다. C언어에서도 한 번에 하위 디렉토리를 만든 함수를 구현해보았습니다.

 

 

mkdir( )

int mkdirs(const char *pathname, mode_t mode);

 

파라미터

pathname
    -  한 번에 생성하려는 디렉토리에 대한 상대 path 또는 절대 path
mode
    - 생성시 설정할 디렉토리에 대한 접근권한을 설정값.
    - 설정값은 umask 설정값과 exclusive or 연산결과값이 설정됩니다.
    - directory 접근권한 = mode & ~umask & 0777
    - mkdir(2)과 같습니다.

mode값은 아래의 상수에 대한  bit or 연산으로 설정할 수 있습니다.
 S_IRUSR : (00400) - owner에 대한 읽기 권한
 S_IWUSR : (00200) - owner에 대한 쓰기 권한
 S_IXUSR : (00100) - owner에 대한 search 권한

 S_IRGRP : (00040) - Group에 대한 읽기 권한
 S_IWGRP : (00020) - Group에 대한 쓰기 권한
 S_IXGRP : (00010) - Group에 대한 search 권한

 S_IROTH : (00004) - Other에 대한 읽기 권한
 S_IWOTH : (00002) - Other에 대한 쓰기 권한
 S_IXOTH : (00001) - Other에 대한 search 권한

디렉토리는 X가 실행권한이 아닌 search 권한입니다. 
search 권한이라고 함은 cd 명령어로 그 디렉토리에 들어갈 수 있느냐? 

위의 상수를 bit or 연산으로 하거나 3자리의 8진수로 설정해도 됩니다.
8진수 0766는
  S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH : S_IXOTH
의미입니다.

 

RETURN

0
    - 정상적으로 디렉토리가 생성되었습니다.
    - 이미 디렉토리가 만들어져 있어도 정상입니다.


-1
    - 오류가 발생하였습니다. 상세한 오류 내용은 errno 전역 변수에 설정됩니다. 
    - 오류 내용은 mkdir()을 참조하기 바랍니다.

 


소스 구현

 

#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>

int mkdirs(const char *path, mode_t mode)
{
    char tmp_path[1024];
    const char *tmp = path;
    int  len  = 0;
    int  ret;

    if(path == NULL || strlen(path) >= 1024) {
        return -1;
    }

    /* 
    * 상위 디렉토리가 존재하는 지 검사하여, 미존재 시에  상위 디렉토리를 생성함
    */
    while((tmp = strchr(tmp, '/')) != NULL) {
        len = tmp - path;
        tmp++;
        
        if(len == 0) {
            continue;
        }

        strncpy(tmp_path, path, len);
        tmp_path[len] = 0x00;

        if((ret = mkdir(tmp_path, mode)) == -1) {
            if(errno != EEXIST) {
                return -1;
            }
        }
    }

    if(mkdir(path, mode) == -1) {
        if(errno != EEXIST) {
            return -1;
        }
    }
    return 0;
}

 

Source Download :

mkdirs.c
0.00MB

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

Tag , ,

댓글을 달아 주세요