0

サーバー A からサーバー B にダンプするディレクトリ ( DIR_A ) があり、これには数週間かかると予想されます。DIR_Aには通常のツリー構造があります。つまり、ディレクトリにはサブフォルダやファイルなどがあります。

目的: DIR_Aがサーバー B にダンプされているため、DIR_Aを調べて その中の特定のファイルを検索する必要があります (サーバー A は送信されるすべてのファイルの名前を変更するため、各ファイルの正確な名前はわかりません)。DIR_A内のいくつかのファイルを処理するのに何週間も待つことができません。そのため、サーバー B でファイルを受信したら、いくつかのファイルの操作を開始したいと考えています。

概要: サーバー AがDIR_Aをサーバー B に送信します。数週間かかると予想されます。アップロードが完了する前に、B でファイルの処理を開始する必要があります。

試行案: DIR_A の内容を一覧表示するプログラムを作成することにしました。DIR_Aのフォルダーとサブフォルダー内にファイルが存在するかどうかをた。DIR_A内のファイルの EOF を探すかもし​​れないと思いた。存在しない場合、ファイルはまだ完全にアップロードされていません。EOF が見つかるまで待つ必要があります。そのため、ループを続け、ファイルのサイズを計算し、EOF が存在するかどうかを確認します。その場合は、そのファイルの処理を開始します。

上記をシミュレートするために、テキストファイルに書き込むプログラムを作成して実行し、完了を待たずに途中で停止することにしました。以下のプログラムを使用して、EOF が見つかるかどうかを判断しようとしました。テキスト ファイルへの書き込みプログラムを突然終了したため、eof が存在しないため、出力 " EOF FOUND" に到達しないはずであると想定しました。これに到達したので、私は間違っています。また、feof() と fseek() も試しました。

std::ifstream file(name_of_file.c_str, std::ios::binary);
//go to the end of the file to determine eof
char character;
file.seekg(0, ios::end);
while(!file.eof()){

    file.read(character, sizeof(char));

}
file.close();
std::cout << "EOF FOUND" << std::endl

ファイルが完全に書き込まれたかどうかを判断するアイデアを誰か提供できますか?

4

4 に答える 4

2

EOF は、これ以上データがないことを伝える C++ の方法です。ファイルが完全に書き込まれたかどうかを確認するために使用できる EOF の「文字」はありません。

これは通常、myfile.txt.transferring という 1 つの名前でファイルを転送し、転送が完了したら、ファイルをターゲット ホストに移動します (myfile.txt のような場所に戻します)。別のディレクトリを使用して同じことを行うことができます。

于 2010-09-10T18:46:01.307 に答える
0

C にも C++ にも、別のプロセスによる書き込みのためにファイルがまだ開いているかどうかを判断する標準的な方法はありません。同様の状況があります。ファイルを送信するサーバーがあり、できるだけ早くそれらを取得して処理する必要があります。そのためにinotify、IN_CLOSE_WRITE イベント (書き込みのために開かれた後にファイルが閉じられた) 用に構成されたウォッチを備えた Linux のサブシステムを使用します。

OSによっては、同様の機能がある場合があります。またはlsof、すでに提案されているとおりです。

于 2010-09-10T18:56:25.023 に答える
0

C では、C++ でも同じだと思いますEOFが、文字ではありません。これは、ファイルが存在する (または存在しない) 状態です。文字と同じmedia removednetwork down、文字ではありません。

于 2010-09-10T18:46:46.717 に答える
0

すべての有限ファイルには終わりがあります。ファイルが 1 つのプロセスによって書き込まれ、(OS がそれを許可していると仮定して) 別のプロセスによって同時に (書き込まれるよりも速く) 読み取られる場合、読み取られたすべての文字を読み取ると、読み取りプロセスは EOF を認識します。書いた。

おそらくうまくいくのは、かなりの数のバイトを受け取り、それらをファイルに書き込むことを保証できる時間の長さを判断できる場合(OSのバッファリングに注意してください)、ディレクトリを1回につき1回歩くことができることですファイル サイズが変更されたファイルは未完成と見なすことができます。

別のアプローチでは、OS のサポートが必要になります。受信プロセスによって開かれているファイルを確認するには、 のようなツールを使用しますlsof。受信者が開いているファイルは未完成です。

于 2010-09-10T18:52:15.847 に答える