Membuat direktori baru di C

96

Saya ingin menulis program yang memeriksa keberadaan direktori; jika direktori itu tidak ada maka itu membuat direktori dan file log di dalamnya, tetapi jika direktori tersebut sudah ada, maka itu hanya membuat file log baru di folder itu.

Bagaimana saya melakukan ini di C dengan Linux?

Jeegar Patel
sumber
1
Fungsi mkdir membuat direktori baru, blog.tremend.ro/2008/10/06/…
fsonmezay
1
mungkin itu karena Anda dapat menemukan solusinya di google atau bahkan di sini dengan membuat pencarian sederhana stackoverflow.com/search?q=C+make+directory . Ngomong-ngomong, aku bukan orang yang memilih.
fsonmezay
Harap edit pertanyaan Anda untuk menunjukkan kode yang Anda miliki sejauh ini . Anda harus menyertakan setidaknya garis besar (tetapi lebih disukai contoh minimal yang dapat direproduksi ) dari kode yang bermasalah, kemudian kami dapat mencoba membantu dengan masalah spesifik tersebut. Anda juga harus membaca Cara Bertanya .
Toby Speight

Jawaban:

146

Lihatlah statuntuk memeriksa apakah direktori tersebut ada,

Dan mkdir, untuk membuat direktori.

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

Anda dapat melihat manual dari fungsi-fungsi ini dengan perintah man 2 statdan man 2 mkdir.

Arnaud Le Blanc
sumber
5
Saya percaya mkdirdi Linux membutuhkan parameter kedua mode,, selain path.
Paul R
1
@Uku: meneruskan jumlah parameter yang salah ke suatu fungsi adalah Perilaku Tidak Terdefinisi, jadi meskipun tampaknya berfungsi untuk Anda dalam satu contoh, Anda tidak boleh mengandalkannya.
Paul R
3
Apa tujuan memeriksa bahwa direktori tidak ada sebelum membuatnya? Bahkan jika stat mengatakan itu belum ada, proses lain mungkin telah membuatnya untuk sementara.
Brandin
2
@Brandin Saya kira saya membabi buta menjawab pertanyaan OP :) Anda benar tentang kondisi balapan.
Arnaud Le Blanc
4
Ini akan ditandai oleh sebagian besar penganalisis statis yang baik sebagai risiko
TOCTOU
22

Anda dapat menggunakan mkdir:

$ pria 2 mkdir

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

int result = mkdir("/home/me/test.txt", 0777);
Paul R
sumber
Apakah ini akan menghapus dan mengganti direktori yang ada?
jjxtra
@jjxtra :: no, ini akan gagal jika direktorinya sudah ada, dengan cara yang sama seperti jika Anda mencoba operasi yang sama dari baris perintah.
Paul R
Itulah yang saya duga. Adakah masalah kinerja dengan melewatkan pemeriksaan stat dan hanya mkdir setiap saat?
jjxtra
@ Jjxtra: kecuali Anda membuat ribuan direktori, saya tidak dapat membayangkan akan ada perbedaan kinerja yang dapat diukur.
Paul R
7

Saya ingin menulis program yang (...) membuat direktori dan file (...) di dalamnya

karena ini adalah pertanyaan yang sangat umum, berikut adalah kode untuk membuat beberapa tingkat direktori dan kemudian memanggil fopen. Saya menggunakan ekstensi gnu untuk mencetak pesan kesalahan dengan 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
sumber
3
hanya 5 sen saya - mode 0777 untuk dir mungkin tidak diinginkan - mungkin 0755 lebih baik, atau bahkan melewati parameter?
ivan.ukr