2

同じファイルの読み取りと書き込みを行う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でコーディングしています。

御時間ありがとうございます。

4

1 に答える 1

4

ファイルロックは、ネットワーク共有へのファイルアクセスに対して確実かつ堅牢に機能しないことが知られています。簡単に言えば、相互排除を実装するための別のメカニズムを見つける必要があります。たとえば、クライアント/サーバーデータベース設計を使用します。

于 2013-01-29T10:41:28.013 に答える