2013-09-08 21 views
13

Şimdi bir temel sanal dosya sistemi arşivi (sıkıştırma olmadan) için bir ayıklayıcı yazıyorum.Dizinleri otomatik olarak kullanarak nasıl oluşturulur

Ayıklamacı, bir dosyayı varolmayan bir dizine yazdığında sorunlara yol açıyor.

Özü fonksiyonu:

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; 
} 

ifslength dosya uzunluğu, dosya başladığında offset değerdir vfs kök dosyasıdır ve path kazancınız dosyasından bir değer kaymalarını len vb olduğunu

Örneğin, yol data/char/actormotion.txt'dir.

Teşekkürler.

+0

, sadece dosyaları yazmak için var altında iki çözümü vardır. Muhtemelen 'destek' için keyfi bir platformda dizinler oluşturmak için iyi bir sarmalayıcı vardır. – stefan

+0

@WhozCraig zor olacak çünkü bu arşivde farklı yönlerde 20 000 dosya vardı. –

cevap

26

ofstream hiçbir zaman dizin oluşturmaz. Aslında, C++ bir dizin oluşturmanın standart bir yolunu sağlamaz.

Posix sistemlerinde veya Windows eşdeğerleri veya Boost.Filesystem üzerinde dirname ve mkdir kullanabilirsiniz. Temel olarak, gerekliyse oluşturularak dizinin var olduğundan emin olmak için ofstream numaralı çağrıdan hemen önce bir kod eklemelisiniz. mümkün değil ofstream ile

+4

+1, C++ ile ilgili dosya sistemi dizinlerini standart bir şekilde oluşturmama konusundaki not, çoğu zaman insanlar için bir şok olarak karşımıza çıkıyor. Bahsetmek güzel. – WhozCraig

+0

Bunun için teşekkürler. Hiçbir fikrim yoktu ... saatlerce ne olduğunu anlamaya çalışan kodumla savaştım. Günlerce dosya yazabilirim ve aniden durdu. Klasör oluşturma ile ilgilenen başka bir kod parçası olduğunu fark etmedim .. –

+0

[Dizinleri oluşturmak için standart bir yol] (http://en.cppreference.com/w/cpp/filesystem/create_directory) ile birlikte eklendi. C++ 'da std :: filesystem' kütüphanesi 17. Şu anda [derleyici tam ve resmi olarak desteklemiyor] (http://en.cppreference.com/w/cpp/compiler_support#C.2B.2B17_features). – ebk

14

Onun ofstream ile bir dizin oluşturma boost::filesystem::exists yerine

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

Bu yöntemler artık standart bir parçasıdır ve şu anda "std :: experimental :: filesystem" – Paul

4

kullanabilir miyim bir dizin

varlığını kontrol etmek mümkün değildir. Özellikle dosyalar için kullanılır.

Çözüm 1:

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

Çözüm 2:

bir `std :: ofstream` mümkün olmayacak
#include <windows.h> 
int _tmain() { 
    CreateDirectory("MyDir", NULL); 
} 
İlgili konular