सी में एक नई निर्देशिका बनाना


96

मैं एक कार्यक्रम लिखना चाहता हूं जो एक निर्देशिका के अस्तित्व की जांच करता है; यदि वह निर्देशिका मौजूद नहीं है, तो यह निर्देशिका और उसके अंदर एक लॉग फ़ाइल बनाता है, लेकिन यदि निर्देशिका पहले से मौजूद है, तो यह सिर्फ उस फ़ोल्डर में एक नई लॉग फ़ाइल बनाता है।

मैं लिनक्स के साथ सी में यह कैसे करूंगा?


1
mkdir फ़ंक्शन एक नई निर्देशिका बनाता है। blog.tremend.ro/2008/10/06/…
fsonmezay

1
शायद ऐसा इसलिए है क्योंकि आप एक सरल खोज stackoverflow.com/search?q=C+make+directory द्वारा Google में या यहां तक ​​कि समाधान पा सकते हैं । वैसे मैं वह आदमी नहीं हूं जिसने वोट दिया है।
fsonmezay

अब तक आपके पास मौजूद कोड दिखाने के लिए कृपया अपने प्रश्न को संपादित करें । आपको उस कोड की कम से कम एक रूपरेखा (लेकिन अधिमानतः एक न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण ) को शामिल करना चाहिए जिससे आपको समस्या हो रही है, तो हम विशिष्ट समस्या के साथ मदद करने का प्रयास कर सकते हैं। आपको कैसे पूछना है यह भी पढ़ना चाहिए ।
स्पाइट

जवाबों:


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 statऔर man 2 mkdirकमांड के साथ देख सकते हैं ।


5
मेरा मानना ​​है कि mkdirलिनक्स के तहत दूसरे पैरामीटर की आवश्यकता होती है mode, इसके अलावा path
पॉल आर

1
@Uku: किसी फ़ंक्शन के लिए गलत मापदंडों को पारित करना अपरिभाषित व्यवहार है, इसलिए जब यह आपके लिए एक उदाहरण में काम करने के लिए प्रकट हो सकता है तो आपको इस पर भरोसा नहीं करना चाहिए।
पॉल आर

3
यह जाँचने का क्या उद्देश्य है कि इसे बनाने से पहले निर्देशिका मौजूद नहीं है? यहां तक ​​कि अगर स्टेट कहता है कि यह अभी तक मौजूद नहीं है, तो इस बीच एक और प्रक्रिया बन सकती है।
ब्रैंडिन

2
@ ब्रैंडिन मुझे लगता है कि मैंने नेत्रहीन रूप से ओपी के सवाल का जवाब दिया :) आप दौड़ की स्थिति के बारे में सही हैं।
अरनौद ले ब्लैंक

4
इसे
TOCTOU

22

आप mkdir का उपयोग कर सकते हैं:

$ आदमी 2 mkdir

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

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

क्या यह मौजूदा निर्देशिकाओं को हटा और बदल देगा?
jjxtra

@jjxtra :: नहीं, यह विफल होना चाहिए यदि निर्देशिका पहले से मौजूद है, उसी तरह जैसे कि आपने कमांड लाइन से उसी ऑपरेशन का प्रयास किया था।
पॉल आर

यही मैंने अनुमान लगाया होगा। हर बार स्टेट चेक और सिर्फ mkdir को छोड़ कर कोई प्रदर्शन समस्या?
jjxtra

@jjxtra: जब तक आप हजारों निर्देशिकाएं नहीं बना रहे हैं, मैं कल्पना नहीं कर सकता कि कोई औसत दर्जे का प्रदर्शन अंतर होगा।
पॉल आर

7

मैं एक प्रोग्राम लिखना चाहता हूं जो (...) डायरेक्टरी और (...) फाइल बनाता है

क्योंकि यह एक बहुत ही सामान्य प्रश्न है, यहाँ कई निर्देशिकाओं के स्तर और कॉल फ़ोपेन बनाने के लिए कोड है। मैं प्रिंट के साथ त्रुटि संदेश प्रिंट करने के लिए एक ग्नू एक्सटेंशन का उपयोग कर रहा हूं।

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 सेंट - मोड 0777 के लिए डीआईआर वांछित नहीं हो सकता है - शायद 0755 बेहतर है, या यहां तक ​​कि पैरामीटर द्वारा पारित किया गया है?
ivan.ukr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.