C언어 하위 디렉터리까지 모든 디렉터리 만들기 함수
C언어에서 mkdir() 함수로 디렉터리를 생성할 수 있지만, 만들려는 디렉터리의 상위 디렉터리가 있어야 생성됩니다. 디렉터리가 없는 곳에 디렉터리를 만들 수 없습니다. 그래서 상위 디렉터리가 없으면 상위 디렉터리를 차례로 만들어 전체 디렉터리를 만드는 함수 force_directory()입니다.
force_directory()
#include <stdio.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <sys/stat.h> void force_directory( char *a_dirc){ char buff[1024]; int sz_dirc; int ndx; sz_dirc = strlen( a_dirc); for ( ndx = 1; ndx < sz_dirc; ndx++){ if ( '/' == a_dirc[ndx]){ memset( buff, 0, sizeof( buff)); memcpy( buff, a_dirc, ndx); if ( 0 != access( buff, F_OK)){ mkdir( buff, 0777); } } } if ( 0 != access( a_dirc, F_OK)){ mkdir( a_dirc, 0777); } } int main( void) { force_directory( "/home/jwjw/temp/a/b/c"); return 0; }
예제 실행
jwjw@temp$ ls -al 합계 8 drwxrwxr-x 2 jwjw jwjw 4096 4월 22 16:19 . drwxr-xr-x 27 jwjw jwjw 4096 4월 22 16:18 .. // temp 디렉터리 안은 비어있습니다. // force_directory()를 호출하는 예제를 실행합니다. jwjw@temp$ ls -al 합계 12 drwxrwxr-x 3 jwjw jwjw 4096 4월 22 16:24 . drwxr-xr-x 27 jwjw jwjw 4096 4월 22 16:18 .. drwxr-xr-x 3 jwjw jwjw 4096 4월 22 16:24 a jwjw@temp$ cd a jwjw@a$ ls -al 합계 12 drwxr-xr-x 3 jwjw jwjw 4096 4월 22 16:24 . drwxrwxr-x 3 jwjw jwjw 4096 4월 22 16:24 .. drwxr-xr-x 3 jwjw jwjw 4096 4월 22 16:24 b jwjw@a$ cd b jwjw@b$ ls -al 합계 12 drwxr-xr-x 3 jwjw jwjw 4096 4월 22 16:24 . drwxr-xr-x 3 jwjw jwjw 4096 4월 22 16:24 .. drwxr-xr-x 2 jwjw jwjw 4096 4월 22 16:24 c jwjw@b$ cd c jwjw@c$ ls -al 합계 8 drwxr-xr-x 2 jwjw jwjw 4096 4월 22 16:24 . drwxr-xr-x 3 jwjw jwjw 4096 4월 22 16:24 .. jwjw@c$
터미널의 화면 캡쳐 이미지입니다.
주의하실 것은 생성하려는 디렉터리에 홈 디렉터리를 의미하는 ~을 사용하면 안 됩니다. 즉, force_directory( "~/temp/a/b/c") 처럼요. 또한, 생성하려는 디렉터리 전체 이름이 NULL 포함 1024 바이트보다 크면 안 됩니다. 만일 1024보다 큰 이름의 디렉터리를 생성하려면 force_directory() 함수 내의 buff 배열 크기를 키우세요.
'컴퓨터 > 프로그래밍' 카테고리의 다른 글
C언어 파일 크기 구하기 함수 filesize() (0) | 2022.04.30 |
---|---|
C언어 포인터함수와 콜백함수 예제 설명 (0) | 2022.03.30 |
C언어 포인터 사용하는 이유 (1) | 2022.03.28 |