C에서 새 디렉토리 만들기
이 기사는 C에서 새 디렉토리를 만드는 방법에 대한 여러 가지 방법을 보여줍니다.
mkdir
함수를 사용하여 새 디렉토리 만들기
mkdir
은 새 디렉토리를 만드는 데 사용할 수있는 POSIX 호환 함수입니다. 이 함수는 두 개의 인수를 취합니다. 첫 번째는 새로 생성 된 디렉토리의 경로 이름을 가리키는char
포인터이고 두 번째 인수는 비트 마스크로 표시되며 다음을 사용하여 설정할 수있는 권한 비트를 지정합니다. 미리 정의 된 매크로 상수.
다음 예에서는 디렉토리 이름으로 전달할 상수 문자열 변수를 선언하고S_IRWXU
모드 비트를 지정합니다. 이는 소유자가 디렉토리에 대한 읽기/쓰기/실행 권한을 갖게됨을 의미합니다.
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *name = "Arbitrary Directory";
int main(void) {
mkdir(name, S_IRWXU);
exit(EXIT_SUCCESS);
}
이전 예제에서는mkdir
호출을 한 줄 코드에 넣었지만 프로덕션 수준 코드로 작업 할 때 오류 검사 루틴을 구현하는 것이 중요합니다. 처음에 우리는 새로운 디렉토리가 생성되고 주어진 디렉토리에 의존한다면 코드의 뒷부분이 성공적으로 실행될 수 있는지 확인해야합니다. mkdir
은 오류가 발생하면-1
을 반환하고 그에 따라errno
를 설정합니다. 이 경우switch
문을 구현하여 일부 오류 코드를 확인하고 해당 메시지를 콘솔에 인쇄했습니다.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *name = "Arbitrary Directory";
int main(void) {
errno = 0;
int ret = mkdir(name, S_IRWXU);
if (ret == -1) {
switch (errno) {
case EACCES:
printf("the parent directory does not allow write");
exit(EXIT_FAILURE);
case EEXIST:
printf("pathname already exists");
exit(EXIT_FAILURE);
case ENAMETOOLONG:
printf("pathname is too long");
exit(EXIT_FAILURE);
default:
perror("mkdir");
exit(EXIT_FAILURE);
}
}
exit(EXIT_SUCCESS);
}
mkdirat
기능을 사용하여 새 디렉토리 만들기
mkdirat
는 세 개의 인수를 사용한다는 점을 제외하면 비슷하게 작동하는 또 다른 시스템 호출입니다. 첫 번째는dirfd
시스템 호출로 검색 할 수있는 디렉토리 파일 설명자입니다. 이 파일 설명자는 두 번째 인수로 지정된 경로 이름이 상대적인 경우에 사용됩니다. 이 경우 경로는 현재 작업 디렉토리가 아닌 지정된 디렉토리를 기준으로 해석됩니다.
mkdirat
는mkdir
과 동일한 반환 유형 값을 가지며 그에 따라errno
값을 확인할 수 있습니다(이 페이지의 전체 목록 참조). 다음 예제 코드는 이전 디렉터리에서 현재 디렉터리로 새 디렉터리를 만들려고합니다.
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *name = "Arbitrary Directory";
int main(void) {
DIR *dir = opendir("../");
int dfd = dirfd(dir);
errno = 0;
int ret = mkdirat(dfd, name, S_IRWXU);
if (ret == -1) {
switch (errno) {
case EACCES:
printf("the parent directory does not allow write");
exit(EXIT_FAILURE);
case EEXIST:
printf("pathname already exists");
exit(EXIT_FAILURE);
case ENAMETOOLONG:
printf("pathname is too long");
exit(EXIT_FAILURE);
default:
perror("mkdir");
exit(EXIT_FAILURE);
}
}
closedir(dir);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook