2013-09-08 13 views
13

Sto scrivendo un estrattore per un archivio di base del file system virtuale (senza compressione).Come creare automaticamente le directory usando ofstream

Il mio estrattore sta incontrando problemi quando scrive un file in una directory che non esiste.

funzione

Estratto:

void extract(ifstream * ifs, unsigned int offset, unsigned int length, std::string path) 
{ 
    char * file = new char[length]; 

    ifs->seekg(offset); 
    ifs->read(file, length); 

    ofstream ofs(path.c_str(), ios::out|ios::binary); 

    ofs.write(file, length); 
    ofs.close(); 

    cout << patch << ", " << length << endl; 

    system("pause"); 

    delete [] file; 
} 

ifs è il root file VFS, offset è il valore quando il file si avvia, length è la lunghezza del file e path è un valore da file di quello che salvare gli offset len ​​ecc

Ad esempio percorso è data/char/actormotion.txt.

Grazie.

+0

non è possibile con uno std :: ofstream' ', è in sola scrittura dei file. Probabilmente c'è un buon wrapper per creare directory su una piattaforma arbitraria in 'boost'. – stefan

+0

@WhozCraig sarà difficile perché questo archivio ha 20.000 file in diverse directory. –

risposta

26

ofstream non crea mai directory. In effetti, C++ non fornisce un modo standard per creare una directory.

È possibile utilizzare dirname e mkdir su sistemi Posix o equivalenti di Windows o Boost.Filesystem. In sostanza, è necessario aggiungere del codice prima della chiamata a ofstream, per assicurarsi che la directory esista creando, se necessario.

+4

+1 la nota su C++ che non ha un modo standard di creare directory di filesystem spesso è uno shock per le persone. Bello dirlo. – WhozCraig

+0

grazie per questo. non ne avevo idea..avevo sfidato il mio codice per ore cercando di capire cosa diavolo fosse successo. Potrei scrivere file per giorni e improvvisamente si fermò. Non sapevo che c'era un altro pezzo di codice che si occupava della creazione di cartelle .. –

+0

[Un modo standard per creare directory] (http://en.cppreference.com/w/cpp/filesystem/create_directory) è stato aggiunto insieme a ' libreria std :: filesystem' in C++ 17. Attualmente [nessun compilatore l'ha supportato completamente e ufficialmente] (http://en.cppreference.com/w/cpp/compiler_support#C.2B.2B17_features). – ebk

14

sua non è possibile con ofstream per controllare l'esistenza di una directory

Può usare boost::filesystem::exists invece

boost::filesystem::path dir("path"); 

    if(!(boost::filesystem::exists(dir))){ 
     std::cout<<"Doesn't Exists"<<std::endl; 

     if (boost::filesystem::create_directory(dir)) 
      std::cout << "....Successfully Created !" << std::end; 
    } 
+1

Questi metodi sono ora parte dello standard e attualmente disponibili in 'std :: experimental :: filesystem' – Paul

4

Creazione di una directory con ofstream non è possibile. Viene principalmente utilizzato per i file. Ci sono due soluzioni di seguito:

Soluzione 1:

#include <windows.h> 
int _tmain() { 
    //Make the directory 
    system("mkdir sample"); 
} 

Soluzione 2:

#include <windows.h> 
int _tmain() { 
    CreateDirectory("MyDir", NULL); 
} 
Problemi correlati