2012-05-01 17 views
7

ich die mkdir C++ Funktion in VS 2008 verwenden müssen, die von VS 2005mkdir C++ Funktion

diese Funktion in unserem Code jedoch veraltet zwei Argumente und nimmt verwendet wird, und ich brauche ein eigenständiges Produkt (mit schreiben nur mkdir Funktion) etwas zu debuggen.

Welche Header-Dateien muss ich importieren? Ich habe direct.h verwendet, der Compiler beklagt sich jedoch, dass das Argument keine 2 Argumente benötigt (Grund dafür ist, dass die Funktion in VS 2005 veraltet war).

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

Antwort

11

Wenn Sie Cross-Plattform-Code schreiben möchten, können Sie boost::filesystem Routinen

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

verwenden Diese Bibliothek Abhängigkeit fügt aber die Chancen sind Sie anderen Dateisystem-Routinen auch verwenden werden und boost::filesystem hat einige große Schnittstellen dafür.

Wenn Sie nur ein neues Verzeichnis erstellen müssen und wenn Sie nur VS 2008 verwenden möchten, können Sie _mkdir() verwenden, wie andere festgestellt haben.

+0

+1 Gehen Sie für plattformübergreifend wann immer möglich. – pmr

+3

ISO C++ ist nicht plattformübergreifend? Warum hier die Boost-Abhängigkeit hinzufügen? Ich gehe nicht zu -1 oder so, aber das ist Overkill. Warum eine Link-Time-Lib-Abhängigkeit nur zum Hinzufügen eines Verzeichnisses hinzufügen? Boost Dateisystem ist * nur * Header-Datei nur, weißt du. –

+0

Ich habe Dateisystem-bezogene Funktionen vermieden, weil sie hauptsächlich System-/Compiler-spezifisch waren. Ich bin mir nicht sicher über 'mkdir()', aber könnten Sie mich auf eine Referenz verweisen, wo dies als Standard ISO C++ definiert ist? – Tibor

7

Es ist veraltet, aber die ISO C++ konforme _mkdir() ersetzt es, so dass die Version verwenden. Alles, was Sie es ist, das einzige Argument ist der Verzeichnisname aufrufen müssen:

#include <direct.h> 

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

Hier ist der Prototyp von MSDN:

int _mkdir (const char * dirname);

+3

Dammit, ninja'd. – Electro

+1

@Electro, tippen Sie schneller, :) –

6

Meine Cross-Plattform-Lösung (rekursiv):

#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

Es gibt einen Fehler im obigen Code in der Funktion "follow_exists". Sie sollten den Rückgabecode auf Fehler überprüfen, wenn Sie die Statistikfunktion aufrufen. Wenn es -1 zurückgibt, liegt ein Fehler vor. In Visual Studio 2010 (mindestens) gibt die Funktion -1 zurück, wenn der Ordner nicht existiert und alle Flags auf 1 gesetzt werden. Ich schlage vor, Sie diese bearbeiten: int ret = stat (dirPath.c_str(), &st); \t \t \t return (ret == 0) && (st.st_mode & S_IFDIR) true: false; Diese richtig funktioniert . –