2012-05-01 10 views
7

ho bisogno di usare il C++ funzione mkdir in VS 2008, che accetta due argomenti ed è deprecato da VS 2005.mkdir C++ funzione

Tuttavia questa funzione viene utilizzata nel nostro codice e ho bisogno di scrivere un prodotto stand-alone (contenente solo la funzione mkdir) per eseguire il debug di qualcosa.

Quali file di intestazione devo importare? Ho usato direct.h, tuttavia il compilatore si lamenta che l'argomento non richiede 2 argomenti (la ragione per questo è che la funzione è stata deprecata in VS 2005).

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

risposta

11

Se si desidera scrivere codice cross-platform, è possibile utilizzare boost::filesystem routine

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

Ciò aggiungere una dipendenza biblioteca, ma è probabile che si intende utilizzare altre routine filesystem come bene e boost::filesystem ha qualche grande interfacce per questo.

Se è necessario solo creare una nuova directory e se si intende utilizzare VS 2008, è possibile utilizzare _mkdir() come altri hanno notato.

+0

+1 Vai per multipiattaforma quando possibile. – pmr

+3

ISO C++ non è multipiattaforma? Perché aggiungere la dipendenza boost qui? Non ho intenzione di -1 o nulla, ma questo è eccessivo. Perché aggiungere una dipendenza della lib di tempo di collegamento solo per aggiungere una directory? Il file system boost è * non * solo il file header, lo sai. –

+0

Ho evitato le funzioni relative al filesystem perché erano per lo più specifiche di sistema/compilatore. Non sono sicuro di 'mkdir()' ma potresti indicarmi un riferimento dove questo è definito come standard ISO C++? – Tibor

7

E 'sconsigliato, ma l'ISO C++ conforme _mkdir() ha sostituito, in modo da utilizzare quella versione. Tutto quello che devi chiamarlo è il nome della directory, l'unico argomento:

#include <direct.h> 

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

Ecco il prototipo da MSDN:

int _mkdir (const char * nomedir);

+3

Dannazione, ninja'd. – Electro

+1

@Electro, digita più veloce, :) –

6

La mia soluzione cross-platform (ricorsiva):

#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

C'è un errore nel codice sopra nella funzione folder_exists. È necessario verificare il codice di ritorno per errore quando si chiama la funzione stat. Se restituisce -1, c'è un errore. Su Visual Studio 2010 (almeno), la funzione restituirà -1 se la cartella non esiste e tutti i flag saranno impostati su 1. vi consiglio questo edit: int ret = stat (dirPath.c_str(), &st); \t \t \t ritorno (RET == 0) && (st.st_mode & S_IFDIR) vere:? False; Ciò funziona correttamente . –