[Linux/c] 재귀적으로 디렉터리 만들기 Programming

아래 소스는 주어진 절대경로에 디렉터리를 만든다. 없으면 계속 만들어나간다.
예를 들어 "home/koala/test/createdir/1st/2nd/3rd/4st/" 까지 디렉터리를 만들고 싶은데 현재는 "home/koala/test/createdir" 까지만 존재한다면, 1st를 만들고, 2nd를 만들고.. 하는 식으로 전부 만든다.

좀더 시간을 투자해서 깔끔하게, 문자열 함수를 가급적 안 쓰면서 좋겠다는 생각이 들지만. 
귀찮아서.. 일단 이렇게 만들어놓고 쓴다. ^^;; 쓰면서 아직까지 문제가 일어나지는 않았는데.. 일단 아래에 두가지는 더 수정해야 한다. 

+ stat 리턴 에러값이 음수이면 무조건 디렉토리를 만드는것은 옳지 않다. 에러 reason이 2(No File or directory던가?) 일때만 만들어야 한다.
+ stat의 결과가 성공이면 이미 directory or file 이 있다는 얘기이므로 또다시 create_directories()를 호출하는 것은 옳지않다.


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

int create_directories( const char* whole_dir, char* current_checked_dir_buf)
{
    // recursively make whole dir path.
    struct stat     st;
    char            now_directory[128] = {'\0',};
    int             len;
    const char      *cp_start, *cp_end;

    // End condition check 
    if( !strcmp( whole_dir, current_checked_dir_buf)) {
        return  0;
    }

    // main logic
    if( current_checked_dir_buf[0] == '\0') { // case of first recursive
        cp_start = strstr( whole_dir, "/");
        cp_end = strstr( cp_start+1, "/");
        strncpy( now_directory, cp_start, cp_end - cp_start);
    }
    else {
        len = strlen( current_checked_dir_buf);
        cp_start = &whole_dir[len];
        cp_end = strstr( cp_start+1, "/");
        if( cp_end == NULL) {
            cp_end = &cp_start[strlen( cp_start)];
        }
        strncpy( now_directory, cp_start, cp_end - cp_start);
    }

    strcat( current_checked_dir_buf, now_directory);
    if( stat( current_checked_dir_buf, &st)< 0) {
        if( mkdir( current_checked_dir_buf, 0777) < 0) {
            printf( "Failed to make directory. path=%s, errno=%d\n", current_checked_dir_buf, errno);
            return -1;
        }
    }
    return create_directories( whole_dir, current_checked_dir_buf);
}

int main( int argc, char** argv)
{
    const char* wholepath = "/home/koala/test/createdir/1st/2nd/3rd/4th/"; // Absolute path
    char current_checked_dir_buf[1024] = {'\0',};
    int rc;

    rc = create_directories( wholepath, current_checked_dir_buf);
    if( rc < 0) {
        printf( "create_directories error!\n");
        return  1;
    }
    return  0;
}

덧글

댓글 입력 영역