2

ファイルのディレクトリを常にポーリングしており、読み取りの特定の基準を満たすファイルが表示されるたびに、ファイルを開いて解析します。

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 がそれを開いて不完全なファイルを解析しようとすることです。ファイルの解析を試みる前に、ファイルの書き込みが完了するまで ifstream を待機させるにはどうすればよいですか?

編集:返信者が私の問題を誤解しているように見えるので、ここで問題をよりよく言いたい. 私は2つのディレクトリを持っています

mydirectory/
mydirectoryParsed/

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

問題は、ネットワーク経由でファイルを mydirectory/ に転送すると、ifstream が転送中にこれらのファイルを認識し、ディレクトリへの書き込みが完了する前に読み取りを開始することです。ファイルを解析する前に、ファイルが完全に書き込まれるまで ifstream を待機させるにはどうすればよいですか?

4

2 に答える 2

4

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

または、監視ディレクトリで命名規則を使用することもできます。転送中のファイルに「.partial」などのサフィックスを追加し、転送が完了したらファイルの名前を変更してサフィックスを削除します。名前がサフィックスで終わるファイルをプログラムで無視するようにします。

于 2012-04-17T01:52:21.527 に答える
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
于 2012-04-17T01:40:06.710 に答える