2013-09-08 26 views
13

Teraz piszę ekstraktor dla podstawowego archiwum systemu plików wirtualnych (bez kompresji).Jak automatycznie tworzyć katalogi za pomocą strumienia danych

Mój ekstraktor napotyka problemy podczas zapisywania pliku w katalogu, który nie istnieje.

Extract funkcja:

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 jest plik korzeń VFS, offset jest wartością po uruchomieniu pliku, length jest długość pliku i path to wartość z pliku co zapisać przesunięcia len itp

Na przykład ścieżka to data/char/actormotion.txt.

Dzięki.

+0

nie jest to możliwe z 'std :: ofstream', to tylko do zapisu plików. Prawdopodobnie istnieje dobre opakowanie do tworzenia katalogów na dowolnej platformie w 'boost'. – stefan

+0

@WhozCraig będzie to trudne, ponieważ archiwum to miało 20 000 plików w różnych katalogach. –

Odpowiedz

26

nigdy nie tworzy katalogów. W rzeczywistości C++ nie zapewnia standardowego sposobu tworzenia katalogu.

Twój mógłby używać dirname i mkdir na systemach Posix lub odpowiednikach Windows lub Boost.Filesystem. Zasadniczo powinieneś dodać kod tuż przed wywołaniem do ofstream, aby upewnić się, że katalog istnieje, tworząc go, jeśli to konieczne.

+4

+1 notatka o C++, która nie ma standardowego sposobu tworzenia katalogów systemu plików, często jest szokiem dla ludzi. Miło o tym wspomnieć. – WhozCraig

+0

dzięki za to. nie miałem pojęcia ... przez kilka godzin biłem się z kodem, próbując zrozumieć, co się stało. mogłem pisać pliki przez kilka dni i nagle przestałem. Nie zdawałem sobie sprawy, że istnieje inny fragment kodu, który zajmował się tworzeniem folderów. –

+0

[Standardowy sposób tworzenia katalogów] (http://en.cppreference.com/w/cpp/filesystem/create_directory) został dodany wraz z ' biblioteka std :: filesystem' w C++ 17. Obecnie jednak [nie kompilator w pełni i oficjalnie ją wspiera] (http://en.cppreference.com/w/cpp/compiler_support#C.2B.2B17_features). – ebk

14

nie jest możliwe ze ofstream Jego celu sprawdzenia istnienia katalogu

można użyć boost::filesystem::exists zamiast

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

Te metody są teraz częścią standardu i obecnie są dostępne w ramach 'std :: experimental :: filesystem' – Paul

4

Tworzenie katalogu z ofstream nie jest możliwe. Jest używany głównie do plików. Istnieją dwa rozwiązania poniżej:

Rozwiązanie 1:

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

Rozwiązanie 2:

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