2013-09-08 6 views
13

ich für ein einfaches virtuelles Dateisystem-Archiv einen Extraktor jetzt schreibe (ohne Komprimierung).Wie Verzeichnisse automatisch erstellen ofstream mit

Mein Extraktor läuft in Probleme, wenn es eine Datei in ein Verzeichnis schreibt, das nicht existiert.

Extract-Funktion:

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 ist die VFS-Root-Datei, offset der Wert ist, wenn die Datei gestartet wird, length die Länge Datei ist und path ist ein Wert aus der Datei, was speichern Offsets len usw.

Zum Beispiel Pfad Daten/Zeichen/actormotion.txt.

Danke.

+0

es nicht möglich ist, mit einem 'std :: ofstream', es ist nur für Dateien zu schreiben. Es gibt wahrscheinlich einen guten Wrapper zum Erstellen von Verzeichnissen auf einer beliebigen Plattform in 'boost'. – stefan

+0

@WhozCraig wird es schwer sein, weil dieses Archiv 20 000 Dateien in verschiedenen Verzeichnissen hatte. –

Antwort

26

ofstream schafft nie Verzeichnisse. Tatsächlich bietet C++ keine Standardmethode zum Erstellen eines Verzeichnisses.

Sie könnte dirname und mkdir auf Posix-Systemen verwenden oder den Windows-Äquivalente oder Boost.Filesystem. Grundsätzlich sollten Sie vor dem Aufruf von ofstream einen Code hinzufügen, um sicherzustellen, dass das Verzeichnis vorhanden ist, indem Sie es bei Bedarf erstellen.

+4

+1 der Hinweis auf C++, dass es keine Standardmethode gibt, Dateisystemverzeichnisse zu erstellen, ist für die Leute oft ein Schock. Schön es zu erwähnen. – WhozCraig

+0

danke dafür. Ich hatte keine Ahnung ... stundenlang mit meinem Code zu kämpfen und zu versuchen zu verstehen, was zur Hölle passiert ist. Ich konnte tagelang Dateien schreiben und hörte plötzlich auf. Didnt erkennt, dass es ein anderes Stück Code war, die die Ordnererstellung kümmerte .. –

+0

[A Standardweg Verzeichnisse erstellen] (http://en.cppreference.com/w/cpp/filesystem/create_directory) wurde zusammen mit 'hinzugefügt std :: filesystem' Bibliothek in C++ 17. Derzeit [kein Compiler hat es voll unterstützt und offiziell] (http://en.cppreference.com/w/cpp/compiler_support#C.2B.2B17_features) though. – ebk

14

Es ist nicht möglich, mit ofstream die Existenz eines Verzeichnisses

verwenden können, ein Verzeichnis mit ofstream zu schaffen, ist nicht möglich boost::filesystem::exists statt

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

Diese Methoden sind jetzt Teil des Standards und derzeit unter 'std :: experimental :: filesystem 'verfügbar – Paul

4

zu überprüfen. Es wird hauptsächlich für Dateien verwendet. Es gibt zwei Lösungen unter:

Lösung 1:

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

Lösung 2:

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