C에서 새 디렉토리 만들기

Jinku Hu 2023년10월12일
  1. mkdir함수를 사용하여 새 디렉토리 만들기
  2. mkdirat기능을 사용하여 새 디렉토리 만들기
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 시스템 호출로 검색 할 수있는 디렉토리 파일 설명자입니다. 이 파일 설명자는 두 번째 인수로 지정된 경로 이름이 상대적인 경우에 사용됩니다. 이 경우 경로는 현재 작업 디렉토리가 아닌 지정된 디렉토리를 기준으로 해석됩니다.

mkdiratmkdir과 동일한 반환 유형 값을 가지며 그에 따라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);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C File