반응형
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 :
반응형
'C언어 응용 > 활용' 카테고리의 다른 글
log 생성 API 구현 (0) | 2019.10.04 |
---|---|
copy_file( ) - 원본 파일의 속성까지 복사하기 (0) | 2019.10.04 |
strncpy시에 한글 반잘림 오류 방지 (0) | 2019.10.04 |
rmdirs( ) - 디렉토리 아래의 모든 파일 및 디렉토리 삭제 (0) | 2019.10.04 |
CRC (Cyclic Redundancy Check) (0) | 2019.10.01 |