Criação de um novo diretório em C

96

Quero escrever um programa que verifique a existência de um diretório; se esse diretório não existir, ele criará o diretório e um arquivo de log dentro dele, mas se o diretório já existir, ele apenas criará um novo arquivo de log nessa pasta.

Como eu faria isso em C com Linux?

Jeegar Patel
fonte
1
A função mkdir cria um novo diretório, blog.tremend.ro/2008/10/06/…
fsonmezay
1
talvez seja porque você pode encontrar a solução no google ou até mesmo aqui, fazendo uma pesquisa simples stackoverflow.com/search?q=C+make+directory . A propósito, não sou o cara que votou contra.
fsonmezay
Por favor edite sua pergunta para mostrar o código você tem até agora . Você deve incluir pelo menos um esboço (mas de preferência um exemplo reproduzível mínimo ) do código com o qual está tendo problemas, então podemos tentar ajudar com o problema específico. Você também deve ler Como perguntar .
Toby Speight

Respostas:

146

Procure statverificar se o diretório existe,

E mkdir, para criar um diretório.

#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);
}

Você pode ver o manual dessas funções com os comandos man 2 state man 2 mkdir.

Arnaud Le Blanc
fonte
5
Acredito que mkdirno Linux precisa de um segundo parâmetro, modealém de path.
Paul R
1
@Uku: passar um número incorreto de parâmetros para uma função é comportamento indefinido, portanto, embora possa parecer funcionar para você em uma instância, você não deve confiar nisso.
Paul R
3
Qual é o propósito de verificar se o diretório não existe antes de criá-lo? Mesmo se stat disser que ainda não existe, outro processo poderia ter criado isso nesse meio tempo.
Brandin de
2
@Brandin Acho que respondi cegamente à pergunta da OP :) Você está certo sobre a condição da corrida.
Arnaud Le Blanc de
4
Isso será sinalizado pela maioria dos bons analisadores estáticos como um risco TOCTOU
kdopen
22

Você pode usar mkdir:

$ man 2 mkdir

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

int result = mkdir("/home/me/test.txt", 0777);
Paul R
fonte
Isso removerá e substituirá os diretórios existentes?
jjxtra de
@jjxtra :: não, ele deve falhar se o diretório já existir, da mesma forma como se você tivesse tentado a mesma operação na linha de comando.
Paul R
Isso é o que eu teria adivinhado. Algum problema de desempenho ignorando a verificação de estatísticas e apenas mkdir sempre?
jjxtra
@jjxtra: a menos que você esteja criando milhares de diretórios, não posso imaginar que haja qualquer diferença mensurável de desempenho.
Paul R
7

Quero escrever um programa que (...) crie o diretório e um (...) arquivo dentro dele

porque esta é uma pergunta muito comum, aqui está o código para criar vários níveis de diretórios e então chamar fopen. Estou usando uma extensão GNU para imprimir a mensagem de erro com 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);
}
Jens Harms
fonte
3
apenas meus 5 centavos - modo 0777 para dir pode não ser desejado - talvez 0755 seja melhor, ou até mesmo passar por parâmetro?
ivan.ukr