C에서 새 디렉토리 만들기


96

디렉토리의 존재를 확인하는 프로그램을 작성하고 싶습니다. 해당 디렉토리가 존재하지 않으면 디렉토리와 그 안에 로그 파일을 생성하지만 디렉토리가 이미 존재하면 해당 폴더에 새 로그 파일을 생성합니다.

Linux에서 C에서 어떻게 할 수 있습니까?


1
MKDIR 함수는 새로운 디렉토리 생성 blog.tremend.ro/2008/10/06/...
fsonmezay

1
아마도 간단한 검색 stackoverflow.com/search?q=C+make+directory를 만들어 Google 또는 여기에서도 솔루션을 찾을 수 있기 때문일 수 있습니다 . 그건 그렇고 나는 투표를 한 사람이 아닙니다.
fsonmezay 2011 년

제발 편집 표시하도록 질문을 지금까지 가지고있는 코드를 . 문제가있는 코드 의 개요 (하지만 가능한 최소한의 재현 가능한 예제 )를 포함해야합니다. 그러면 특정 문제에 대해 도움을 드릴 수 있습니다. How to Ask 도 읽어야 합니다.
Toby Speight 2018

답변:


146

stat디렉토리가 존재하는지 확인하기위한,

그리고 mkdir, 디렉토리를 만듭니다.

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

struct stat st = {0};

if (stat("/some/directory", &st) == -1) {
    mkdir("/some/directory", 0700);
}

man 2 statman 2 mkdir명령을 사용하여 이러한 기능의 설명서를 볼 수 있습니다 .


5
내가 믿는 mkdir리눅스가 두 번째 매개 변수를 필요로 아래 mode에 추가 path.
Paul R

1
@Uku : 잘못된 수의 매개 변수를 함수에 전달하는 것은 정의되지 않은 동작이므로 한 인스턴스에서 작동하는 것처럼 보일 수 있지만 의존해서는 안됩니다.
Paul R

3
디렉토리를 생성하기 전에 존재하지 않는지 확인하는 목적은 무엇입니까? 통계가 아직 존재하지 않는다고 말하더라도 그 동안 다른 프로세스가 생성했을 수 있습니다.
Brandin

2
@Brandin 나는 OP의 질문에 맹목적으로 대답했다고 생각한다 :) 당신은 경쟁 조건에 대해 옳다.
Arnaud Le Blanc

4
이것은 대부분의 우수한 정적 분석기에 의해 TOCTOU 위험으로 표시됩니다
kdopen

22

mkdir을 사용할 수 있습니다.

$ man 2 mkdir

#include <sys/stat.h>
#include <sys/types.h>

int result = mkdir("/home/me/test.txt", 0777);

기존 디렉토리를 제거하고 교체합니까?
jjxtra

@jjxtra :: 아니요, 명령 줄에서 동일한 작업을 시도한 것과 거의 같은 방식으로 디렉터리가 이미 존재하면 실패합니다.
Paul R

그게 내가 짐작했을 것입니다. 통계 검사를 건너 뛰고 매번 mkdir 만 수행하면 성능 문제가 있습니까?
jjxtra

@jjxtra : 수천 개의 디렉토리를 생성하지 않는 한 측정 가능한 성능 차이가있을 것이라고 상상할 수 없습니다.
Paul R

7

(...) 디렉토리와 그 안에 (...) 파일을 생성하는 프로그램을 작성하고 싶습니다.

이것은 매우 일반적인 질문이기 때문에 여기에 여러 수준의 디렉토리를 만들고 fopen을 호출하는 코드가 있습니다. gnu 확장을 사용하여 printf로 오류 메시지를 인쇄하고 있습니다.

void rek_mkdir(char *path) {
    char *sep = strrchr(path, '/');
    if(sep != NULL) {
        *sep = 0;
        rek_mkdir(path);
        *sep = '/';
    }
    if(mkdir(path, 0777) && errno != EEXIST)
        printf("error while trying to create '%s'\n%m\n", path); 
}

FILE *fopen_mkdir(char *path, char *mode) {
    char *sep = strrchr(path, '/');
    if(sep) { 
        char *path0 = strdup(path);
        path0[ sep - path ] = 0;
        rek_mkdir(path0);
        free(path0);
    }
    return fopen(path,mode);
}

3
내 5 센트 만-dir에 대한 0777 모드가 바람직하지 않을 수 있습니다. 0755가 더 낫거나 매개 변수를 통과 할 수도 있습니까?
ivan.ukr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.