您可以通过调用SetFilePointer 或SetFilePointerEx 到所需位置,然后调用SetEndOfFile 来截断文件。下面展示了如何实现truncate 函数:
bool truncate( HANDLE hFile, LARGE_INTEGER NewSize ) {
LARGE_INTEGER Size = { 0 };
if ( GetFileSizeEx( hFile, &Size ) ) {
LARGE_INTEGER Distance = { 0 };
// Negative values move the pointer backward in the file
Distance.QuadPart = NewSize.QuadPart - Size.QuadPart;
return ( SetFilePointerEx( hFile, Distance, NULL, FILE_END ) &&
SetEndOfFile( hFile ) );
}
return false;
}
// Helper function taking a file name instead of a HANDLE
bool truncate( const std::wstring& PathName, LARGE_INTEGER NewSize ) {
HANDLE hFile = CreateFileW( PathName.c_str(), GENERIC_WRITE, FILE_SHARE_READ,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL );
if ( hFile == INVALID_HANDLE_VALUE ) {
return false;
}
bool Success = truncate( hFile, NewSize );
CloseHandle( hFile );
return Success;
}
编辑:短版
truncate 函数可以简写为:
bool truncate( HANDLE hFile, LARGE_INTEGER NewSize ) {
return ( SetFilePointerEx( hFile, NewSize, NULL, FILE_BEGIN ) &&
SetEndOfFile( hFile ) );
}
如果您希望传递缩小文件的字节数,可以使用以下实现:
bool truncate( HANDLE hFile, LARGE_INTEGER ShrinkBy ) {
ShrinkBy.QuadPart = -ShrinkBy.QuadPart;
return ( SetFilePointerEx( hFile, ShrinkBy, NULL, FILE_END ) &&
SetEndOfFile( hFile ) );
}
要增大文件,请使用 CreateFile 和包含 FILE_APPEND_DATA 的 dwDesiredAccess 打开文件。再次使用SetFilePointer 将文件指针设置为文件末尾,然后您可以调用WriteFile 写入新数据。例如,请参阅Appending One File to Another File。
编辑:在不写入的情况下扩展文件
如果您不关心超出原始文件大小的文件内容,您可以应用与截断文件相同的顺序来扩展它:
bool SetFileSize( HANDLE hFile, LARGE_INTEGER NewSize ) {
return ( SetFilePointerEx( hFile, NewSize, NULL, FILE_BEGIN ) &&
SetEndOfFile( hFile ) );
}
这是SetEndOfFile 的记录行为:
SetEndOfFile 函数可用于截断或扩展文件。如果文件被扩展,文件的旧端和新端之间的文件内容没有定义。