同じファイルの読み取りと書き込みを行う2つのプログラムがあります。1つはデータを追加し、もう1つはファイルをクリアしてから、すべてのデータを再書き込みします。
2つのプログラムは同じコンピューター上で正常に相互作用しますが、一方を別のコンピューターで実行し、ローカルネットワーク経由でファイルを開くと、追加が間に合わないようです。
私のプロセスは次のとおりです。
プログラム1:
でファイルを開く
handle = CreateFile(str.c_str(), FILE_READ_DATA|FILE_APPEND_DATA, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
以下を使用してデータを書き込みます。
WriteFile(handle, line, strlen(line), &Written, NULL);
以下を使用してファイルを閉じます。
CloseHandle(handle);
プログラム2:
次のファイルを開きます。
handle = CreateFile(str.c_str(), FILE_READ_DATA|FILE_WRITE_DATA, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
ファイルサイズが前回を使用して読み取られたときと異なる場合:
size = GetFileSize(handle, &size_high);
(ここではサイズのみを確認しています。ファイルサイズが比較的小さいため、size_highは無視されます))次に、ファイルを閉じ、FILE_READ_DATAフラグを使用して開き、データを再ロードしてから、前の手順から再試行します。
それ以外の場合は、以下を使用してファイルデータをクリアします。
SetFilePointer(handle,0,NULL,FILE_BEGIN); SetEndOfFile(handle);
以下を使用してすべてのデータを書き換えます。
WriteFile(handle, line, strlen(line), &Written, NULL);
以下を使用してファイルを閉じます。
CloseHandle(handle)
プログラム1は、ファイルが別のプログラムによってロックされている場合、保存を再試行するようにユーザーに促します。ファイルが別のプログラムによってロックされている場合、プログラム2は数回再試行します。
ネットワーク経由でファイルにアクセスするとき、プログラム1の追加操作は、データをクリアして再書き込みする前に、プログラム2によって取得されていないようです。プログラム1でFILE_FLAG_WRITE_THROUGHフラグを設定し、FlushFileBuffers(handle)を使用してファイルを開いてから、運が悪かったのでファイルを閉じてみました。
このプロセスで欠けているものはありますか?
それが助けになるなら、私はEmbarcadero C++Studioでコーディングしています。
御時間ありがとうございます。