c - 在没有争用条件的窗口上将文件大小增加到至少 N



我正在寻找一种方法,以不受竞争条件影响的方式将文件大小增加到至少 N 个字节。

couse的简单方法具有竞争条件:

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

有什么想法吗?

编辑:对竞争条件的详细说明:

初始文件大小为零。爱丽丝希望将大小设置为至少 100。Bob 希望将大小设置为至少 200。很明显,如果没有竞争条件,那么当 Alice 和 Bob 都完成时,文件的大小必须至少为 200。

假设 Alice 和 Bob 都将当前文件大小读取为零。然后 Bob 看到他需要将大小增加到 200,因此他将大小设置为 200。现在爱丽丝开始跑步,她得出结论,100大于零,她认为这是当前的大小,然后她将大小设置为100。

使用文件锁定来确保只有一个进程弄乱了文件。

可能是这样的:

check file size, if too small then
  Lock file
  check size again
  set size if needed
  Unlock file

我找到了一种方法:

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);

想知道与我上面提到的幼稚方法相比,这样做的开销是多少。

显然,无论该文件是否已存在任何对象,始终可以创建新的文件映射对象。文档在这方面非常模糊,但我已经检查了它是否有效。

最新更新