0

競合状態に悩まされない方法で、ファイルのサイズを少なくともNバイトに増やす方法を探しています。

単純なアプローチには、競合状態があります。

LARGE_INTEGER large_int;
GetFileSizeEx(handle, &large_int);
if (large_int.QuadPart < N) {
  SetFilePointerEx(handle, N, 0, FILE_BEGIN);
  SetEndOfFile(handle);
}

何か案は?

編集:競合状態の詳細:

初期ファイルサイズはゼロです。アリスはサイズを少なくとも100に設定したいと考えています。ボブはサイズを少なくとも200に設定したいと考えています。競合状態がなかったことは明らかです。アリスとボブの両方が終了したら、ファイルのサイズは次のようになります。少なくとも200。

アリスとボブの両方が現在のファイルサイズをゼロとして読み取ると仮定します。次に、ボブはサイズを200に増やす必要があることを確認したので、サイズを200に設定しました。アリスは実行を開始し、100はゼロより大きいと結論付けます。これは現在のサイズであると考えてから、サイズを100にします。

4

2 に答える 2

1

ファイルロックを使用して、1つのプロセスだけがファイルを混乱させていることを確認します。

おそらく次のようなものです:

check file size, if too small then
  Lock file
  check size again
  set size if needed
  Unlock file
于 2013-01-23T02:31:08.760 に答える
0

私はそれを行う方法を見つけました:

DWORD protect = PAGE_READONLY;
LARGE_INTEGER large_int;
large_int.QuadPart = desired_minimum_size;
HANDLE map_handle = CreateFileMapping(file_handle, 0, protect, large_int.HighPart, large_int.LowPart, 0);
CloseHandle(map_handle);

このようにすることのオーバーヘッドは、私が上で述べた素朴なアプローチと比較されるのだろうか。

どうやら、そのファイルにすでに存在するかどうかに関係なく、新しいファイルマッピングオブジェクトを作成することは常に可能です。ドキュメントはこの点でかなり曖昧ですが、私はそれが機能することを確認しました。

于 2013-02-02T17:39:24.540 に答える