Mic*_*eyn 19
以编程方式,在Windows上,您必须使用Win32 API函数来执行此操作:
SetFilePointerEx() followed by SetEndOfFile()
Run Code Online (Sandbox Code Playgroud)
您可以使用这些函数为文件预分配集群并避免碎片.这比预先将数据写入文件更有效.在做你的之前这样做fopen()
.
如果要完全避免使用Win32 API,还可以使用system()函数以非编程方式执行此操作,以发出以下命令:
fsutil file createnew filename filesize
Run Code Online (Sandbox Code Playgroud)
您可以使用该SetFileValidData
函数来扩展文件的逻辑长度,而无需将所有数据写入磁盘.但是,因为它可以允许读取您可能没有特权的磁盘数据,所以它需要SE_MANAGE_VOLUME_NAME
使用该特权.仔细阅读文档的备注部分.
我建议改为只写出0.您也可以使用SetFilePointerEx
和SetEndOfFile
扩展文件,但这样做仍然需要将零写入磁盘(除非该文件很稀疏,但这会使预留磁盘空间失败).请参阅为什么我的单字节写入需要永远?有关更多信息.
示例代码,请注意,它不一定更快,尤其是对于 NTFS 等智能文件系统。
if ( INVALID_HANDLE_VALUE != (handle=CreateFile(fileName,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,NULL) )) {
// preallocate 2Gb disk file
LARGE_INTEGER size;
size.QuadPart=2048 * 0x10000;
::SetFilePointerEx(handle,size,0,FILE_BEGIN);
::SetEndOfFile(handle);
::SetFilePointer(handle,0,0,FILE_BEGIN);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15132 次 |
最近记录: |