C'de yeni bir dizin oluşturma


97

Bir dizinin varlığını kontrol eden bir program yazmak istiyorum; bu dizin yoksa, dizini ve içinde bir günlük dosyası oluşturur, ancak dizin zaten mevcutsa, o klasörde yalnızca yeni bir günlük dosyası oluşturur.

Bunu Linux ile C'de nasıl yaparım?


1
mkdir işlevi yeni bir dizin oluşturur, blog.tremend.ro/2008/10/06/…
fsonmezay

1
Bunun nedeni belki de çözümü google'da veya hatta burada basit bir arama stackoverflow.com/search?q=C+make+directory yaparak bulabilmenizdir . Bu arada, oy veren kişi ben değilim.
fsonmezay

Lütfen şu ana kadar sahip olduğunuz kodu gösterecek şekilde sorunuzu düzenleyin . Sorun yaşadığınız kodun en azından bir taslağını (ancak tercihen tekrarlanabilir minimum bir örneğini ) eklemelisiniz , o zaman belirli bir soruna yardımcı olmaya çalışabiliriz. Ayrıca Nasıl Sorulur'u da okumalısınız .
Toby Speight

Yanıtlar:


149

statDizinin var olup olmadığını kontrol etmek için bakın ,

Ve mkdirbir dizin oluşturmak için.

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

Bu işlevlerin kılavuzunu man 2 statve man 2 mkdirkomutları ile görebilirsiniz.


5
mkdirLinux altında buna modeek olarak ikinci bir parametreye ihtiyaç duyduğuna inanıyorum path.
Paul R

1
@Uku: Bir işleve yanlış sayıda parametre iletmek Tanımsız Davranıştır, bu nedenle bir durumda sizin için işe yarıyor gibi görünse de ona güvenmemelisiniz.
Paul R

3
Oluşturmadan önce dizinin olmadığını kontrol etmenin amacı nedir? Stat henüz olmadığını söylese bile, bu arada başka bir süreç onu yaratmış olabilir.
Brandin

2
@Brandin Sanırım OP'nin sorusuna körü körüne cevap verdim :) Yarış durumu konusunda haklısınız.
Arnaud Le Blanc

4
Bu, çoğu iyi statik analizci tarafından TOCTOU riski olarak işaretlenecek
kdopen

22

Mkdir kullanabilirsiniz:

$ adam 2 mkdir

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

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

Bu, mevcut dizinleri kaldırıp değiştirecek mi?
jjxtra

@jjxtra :: hayır, dizin zaten mevcutsa, aynı işlemi komut satırından yapmışsınız gibi başarısız olmalıdır.
Paul R.

Ben de öyle tahmin etmiştim. İstatistik kontrolünü atlayarak ve her seferinde sadece mkdir yaparak herhangi bir performans sorunu var mı?
jjxtra

@jjxtra: Binlerce dizin oluşturmadığınız sürece ölçülebilir bir performans farkı olacağını hayal edemiyorum.
Paul R

7

Dizini (...) oluşturan ve içinde bir (...) dosyası olan bir program yazmak istiyorum

çünkü bu çok yaygın bir sorudur, burada birden çok dizin seviyesi oluşturmak ve fopen'i çağırmak için kod. Hata mesajını printf ile yazdırmak için bir gnu uzantısı kullanıyorum.

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
sadece benim 5 sentim - mod 0777 için dir istenmeyebilir - belki 0755 daha iyidir, hatta parametre ile geçebilir mi?
ivan.ukr

@ ivan.ukr 0777 doğru, mod kullanıcıları umask tarafından değiştirilecek. Örneğin. umask 022 için 755 veya umask 007 için 770 ile sonuçlanır.
imix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.