我正在寻找一种方法,以不受竞争条件影响的方式将文件大小增加到至少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。
答案 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);
我想知道这样做的开销与我上面提到的天真方法相比。
显然,无论是否已存在该文件,始终都可以创建新的文件映射对象。文档在这方面非常模糊,但我已经检查过它是否有效。