在没有竞争条件的Windows上将文件大小增加到至少N.

时间:2013-01-23 02:07:33

标签: c windows filesize

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

简单的方法,有一个竞争条件:

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

有什么想法吗?

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

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

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

2 个答案:

答案 0 :(得分:1)

使用File Locking确保只有一个进程正在处理该文件。

可能类似于:

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

答案 1 :(得分: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);

我想知道这样做的开销与我上面提到的天真方法相比。

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