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