在写入文件之前预留磁盘空间以提高效率

当我第一次启用日志loggingfunction时,我注意到我的一个项目中有一个巨大的性能问题。 但是,当达到日志文件限制并且程序开始再次写入文件的开始时,日志logging速度要快得多(大约快50%)。 将日志文件大小设置为数百MB是正常的。

大多数下载pipe理器在开始下载文件之前分配具有所需大小的虚拟文件。 这使得写入更加有效,因为整个块被一次分配。

当我的程序第一次启动时,以某种固定大小有效地保留磁盘空间的最佳方法是什么?

void ReserveSpace(LONG spaceLow, LONG spaceHigh, HANDLE hFile) { DWORD err = ::SetFilePointer(hFile, spaceLow, &spaceHigh, FILE_BEGIN); if (err == INVALID_SET_FILE_POINTER) { err = GetLastError(); // handle error } if (!::SetEndOfFile(hFile)) { err = GetLastError(); // handle error } err = ::SetFilePointer(hFile, 0, 0, FILE_BEGIN); // reset } 

wRAR是正确的。 用你最喜欢的库打开一个新文件,然后寻找倒数第二个字节并在那里写一个0。 这应该分配所有需要的磁盘空间。

这是一个简单的功能,可用于任何大小的文件:

 void SetFileSize(HANDLE hFile, LARGE_INTEGER size) { SetFilePointer(hFile, size, NULL, FILE_BEGIN); SetEndOfFile(hFile); } 

您可以使用SetFileValidData函数来扩展文件的逻辑长度,而不必将所有数据写出到磁盘。 但是,因为它可以允许读取您可能没有权限的磁盘数据,所以需要使用SE_MANAGE_VOLUME_NAME权限。 仔细阅读文档的“备注”部分。

SetFileValidData的实现依赖于fs驱动程序。 Win7以后,NTFS只支持它和FAT。