2013-09-08 9 views
13

私は現在、基本的な仮想ファイルシステムアーカイブ(圧縮なし)用の抽出プログラムを作成しています。ofstreamを使用してディレクトリを自動的に作成する方法

ファイルが存在しないディレクトリに書き込まれたときに、抽出プログラムで問題が発生しています。

抽出機能:

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は、ファイルの長さとpathで、offsetは、ファイルが起動する値であり、VFSルートファイルであるファイルからの値であるオフセットを保存するものでlenなど

たとえば、pathはdata/char/actormotion.txtです。

ありがとうございました。

+0

、それだけでファイルを書き込むためだ以下の2つのソリューションがあります。 'boost'で任意のプラットフォーム上にディレクトリを作成するための良いラッパーがあります。 – stefan

+0

@WhozCraigこのアーカイブには、異なるディレクトリに20,000個のファイルがあるので、難しいでしょう。 –

答えて

26

ofstreamディレクトリを作成しません。実際、C++はディレクトリを作成するための標準的な方法を提供していません。

あなたは、Posixシステムではdirnamemkdir、それと同等のもの、またはBoost.Filesystemを使用できます。基本的には、ofstreamへの呼び出しの直前にコードを追加して、必要に応じてディレクトリを作成します。 ofstream

+4

+1ファイルシステムのディレクトリを作る標準的な方法を持たないC++に関する注釈は、しばしば人々に衝撃を与えます。それに言及していいですね。これのために – WhozCraig

+0

ありがとうございます。私は何も考えていませんでした。何が起こったのかを理解しようと何時間も自分のコードにぶつかった。私は数日間ファイルを書き込むことができ、突然停止しました。フォルダ作成の世話をした別のコードがあることに気付かなかった。 –

+0

[ディレクトリを作成するための標準的な方法](http://en.cppreference.com/w/cpp/filesystem/create_directory)が ' C++のstd :: filesystem'ライブラリ17.現在のところ[コンパイラはそれを完全に公式にサポートしていません](http://en.cppreference.com/w/cpp/compiler_support#C.2B.2B17_features)。 – ebk

14

そのない可能ディレクトリ

の存在を確認するためには、ofstreamの持つディレクトリを作成する代わりにboost::filesystem::exists

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

これらのメソッドは現在、標準の一部であり、 'std :: experimental :: filesystem'のもとで現在利用可能です – Paul

4

を使用することができますことはできません。主にファイルに使用されます。

解決方法1:

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

解決策2:

それは `のstd :: ofstream`では不可能だ
#include <windows.h> 
int _tmain() { 
    CreateDirectory("MyDir", NULL); 
} 
関連する問題