2012-04-17 11 views
1

ファイルを常にポーリングしています。読み込みの基準を満たしているファイルが見つかるたびにファイルを開き、解析します。C++ ifstreamは書き込み中にファイルを開こうとします。

string newLine; 

ifstream fileReader; 

fileReader.open(filename.c_str()); 

while(!fileReader.eof()) 
{ 
getline(fileReader, newLine); 
    // do some stuff with the line... 
} 
filereader.close(); 

上記のコードは、1秒ごとに実行され、新しいファイルのディレクトリをチェックするループにあります。私の問題は、処理するためにファイルをフォルダーに転送するときに、私のループがファイルを見つけ、ファイルの名前をifstreamに渡して誰がそれを開き、不完全なファイルを解析しようとしているかということです。ファイルを解析する前にファイルの書き込みが完了するまでifstreamを待機させるにはどうすればよいですか?

編集: 投稿者は私の問題を誤解しているようですので、ここで問題をよく言いたいと思っています。私は2つのディレクトリを持つ

mydirectory/ 
mydirectoryParsed/ 

私のコードが動作する方法は、それが彼らを見つけたときmydirectoryなどのファイルのための私のプログラムのチェックが/と、それらを解析し、ファイル内の情報を使用していることです。ファイルへの書き込みは行われません。ファイルの解析が終了すると、ファイルはmydirectoryparsedに移動されます。/

問題は、ネットワーク経由でmydirectoryにファイルを転送するとき/ ifstreamはmidtransferファイルを見て、ディレクトリへの書き込みを終了する前にファイルを読み込みます。 。ファイルを解析する前にファイルが完全に書き込まれるまで、ifstreamをどのように待機させるのですか?

+0

ファイルハンドルを開いている間に、そのファイルを書き込んでいる人が読み取りアクセスを拒否するようにしてください。 – ildjarn

答えて

3

直接あなたのプログラムが見ているディレクトリにファイルを転送しないでください。その代わりに、同じドライブ上の別のディレクトリに転送してから、転送が完了したら監視ディレクトリに移動してください。このようにして、完全なファイルは単一のアトミック操作で監視ディレクトリに表示されます。

また、監視対象ディレクトリで命名規則を使用することもできます。転送中のファイルに ".partial"のような接尾辞を付けてから、ファイルの名前を変更して転送を完了します。あなたのプログラムは、名前が接尾辞で終わるファイルを無視するようにしてください。

+0

ありがとうございます!これはプログラムにとっては良いようです!私は余分な拡張子を持つディレクトリに転送し、次に名前を変更します!部分的なファイルの問題を避ける。あなたは命の恩人です! – user1314238

+1

原子移動に関しては、おそらく両方のディレクトリが同じファイルシステム上にあることに注意してください。 – Hugh

+1

それは私が「同じドライブ上」と言った理由ですが、あまり正確ではありません。 – Wyzard

0

ファイルを書き込むたびにファイルを開くはずがありません。一度それを開く!このため

いくつかの擬似コードは次のようになります。

1- Open file 
2- Get the data you want to write, treat that data 
3- Call the write to file function 
4- Loop until you have nothing left to write 
5- Close de file 
+0

申し訳ありませんが、おそらく私はそれを貧弱に言いました。何が起こっているのは、ファイルがmydirectoryディレクトリから処理されているということです。そして、解析するファイルを見つけたら、そのファイルを解析し、ディレクトリからmydirectoryparsed /のようなものに移動します。ネットワーク上のディレクトリに新しいファイルを転送すると、私のプログラムはこれらの新しいファイルのように見えますが、書き込みを終える前に、そのファイルを読み込もうとします。これが私が問題になっている場所です。 – user1314238

+0

fileReader.fail()やfileReader.isopen()などのストリーム検証を検討しましたか? – Erwald

関連する問題