2012-05-01 19 views
7

मैं 2008 वी.एस. जो दो तर्क लेता है और वी.एस. 2005mkdir C++ समारोह

हालांकि इस समारोह हमारे कोड में प्रयोग किया जाता है से हटा दिया गया है में mkdir C++ फ़ंक्शन का उपयोग करने की आवश्यकता है और मैं एक स्टैंडअलोन उत्पाद लिखने की ज़रूरत (युक्त केवल mkdir समारोह) कुछ डीबग करने के लिए।

मुझे आयात करने के लिए कौन सी शीर्षलेख फ़ाइलें चाहिए? मैंने direct.h का उपयोग किया, हालांकि संकलक शिकायत करता है कि तर्क में 2 तर्क नहीं होते हैं (इसके लिए कारण वीएस 2005 में कार्य को बहिष्कृत किया गया था)।

mkdir("C:\hello",0); 

उत्तर

11

आप पार मंच कोड लिखना चाहते हैं, तो आप boost::filesystem दिनचर्या

#include <boost/filesystem.hpp> 
boost::filesystem::create_directory("dirname"); 

उपयोग कर सकते हैं यह एक पुस्तकालय निर्भरता को जोड़ने है, लेकिन संभावना आपको अन्य फाइल सिस्टम दिनचर्या का उपयोग करने जा रहे हैं और boost::filesystem कुछ महान है इसके लिए इंटरफेस।

यदि आपको केवल एक नई निर्देशिका बनाने की आवश्यकता है और यदि आप केवल वीएस 2008 का उपयोग करने जा रहे हैं, तो आप _mkdir() का उपयोग कर सकते हैं जैसा कि अन्य ने नोट किया है।

+0

+1 जब भी संभव हो क्रॉस-प्लेटफ़ॉर्म के लिए जाएं। – pmr

+3

आईएसओ सी ++ क्रॉस-प्लेटफॉर्म नहीं है? यहां बढ़ावा निर्भरता क्यों जोड़ें? मैं -1 या कुछ भी नहीं जा रहा हूं, लेकिन यह अधिक है। निर्देशिका जोड़ने के लिए लिंक लिंक lib निर्भरता क्यों जोड़ें? बूस्ट फाइल सिस्टम केवल * हेडर फ़ाइल नहीं है, आपको पता है। –

+0

मैंने फाइल सिस्टम से जुड़े कार्यों से परहेज किया है क्योंकि वे ज्यादातर सिस्टम/कंपाइलर विशिष्ट थे। मुझे 'mkdir() 'के बारे में निश्चित नहीं है, लेकिन क्या आप मुझे एक संदर्भ में इंगित कर सकते हैं जहां इसे मानक आईएसओ सी ++ के रूप में परिभाषित किया गया है? – Tibor

7

यह पदावनत है, लेकिन आईएसओ सी ++ अनुरूप _mkdir() बदल दिया है, ताकि संस्करण का उपयोग करें।

#include <direct.h> 

void foo() 
{ 
    _mkdir("C:\\hello"); // Notice the double backslash, since backslashes 
         // need to be escaped 
} 

यहाँ MSDN से प्रोटोटाइप है:: सभी आप इसे कॉल करने की आवश्यकता निर्देशिका का नाम, अपने एकमात्र तर्क है

पूर्णांक _mkdir (स्थिरांक चार * dirname);

+3

Dammit, ninja'd। – Electro

+1

@Electro, तेजी से टाइप करें, :) –

6

मेरे पार मंच समाधान (पुनरावर्ती):

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

// for windows mkdir 
#ifdef _WIN32 
#include <direct.h> 
#endif 

namespace utils 
{ 
    /** 
    * Checks if a folder exists 
    * @param foldername path to the folder to check. 
    * @return true if the folder exists, false otherwise. 
    */ 
    bool folder_exists(std::string foldername) 
    { 
     struct stat st; 
     stat(foldername.c_str(), &st); 
     return st.st_mode & S_IFDIR; 
    } 

    /** 
    * Portable wrapper for mkdir. Internally used by mkdir() 
    * @param[in] path the full path of the directory to create. 
    * @return zero on success, otherwise -1. 
    */ 
    int _mkdir(const char *path) 
    { 
    #ifdef _WIN32 
     return ::_mkdir(path); 
    #else 
    #if _POSIX_C_SOURCE 
     return ::mkdir(path); 
    #else 
     return ::mkdir(path, 0755); // not sure if this works on mac 
    #endif 
    #endif 
    } 

    /** 
    * Recursive, portable wrapper for mkdir. 
    * @param[in] path the full path of the directory to create. 
    * @return zero on success, otherwise -1. 
    */ 
    int mkdir(const char *path) 
    { 
     std::string current_level = ""; 
     std::string level; 
     std::stringstream ss(path); 

     // split path using slash as a separator 
     while (std::getline(ss, level, '/')) 
     { 
      current_level += level; // append folder to the current level 

      // create current level 
      if (!folder_exists(current_level) && _mkdir(current_level.c_str()) != 0) 
       return -1; 

      current_level += "/"; // don't forget to append a slash 
     } 

     return 0; 
    } 
} 
+0

फ़ोल्डर_एक्सिस्ट फ़ंक्शन में उपरोक्त कोड में कोई गलती है। जब आप स्टेट फ़ंक्शन को कॉल करते हैं तो आपको त्रुटि के लिए रिटर्न कोड की जांच करनी चाहिए। यदि यह -1 लौटाता है, तो एक त्रुटि होती है। विजुअल स्टूडियो 2010 (कम से कम) पर, फ़ंक्शन 1 लौटाएगा यदि फ़ोल्डर मौजूद नहीं है और सभी ध्वज 1 पर सेट हो जाएंगे।? यह सही ढंग से काम करता है, झूठी: पूर्णांक सेवानिवृत्त = स्टेट (dirPath.c_str(), &st); \t \t \t वापसी (सेवानिवृत्त == 0) && (st.st_mode और S_IFDIR) सच: मैं आप इस संपादित करने का सुझाव । –

संबंधित मुद्दे