获得文件大小的函数GetFileSizeEx(...)和GetCompressedFileSize(...)
文件的逻辑大小和物理大小:假设一个100KB的文件经过压缩后只占用85KB,调用GetFileSizeEx返回的是文件的逻辑大小(100KB),而调用GetCompressedFileSize返回的是文件的物理大小(85KB)。
1. GetFileSizeEx()获取文件逻辑大小
函数原型:
1 BOOL GetFileSizeEx( 2 HANDLE hFile, 3 PLARGE_INTEGER pliFileSize);
hFile 一个已打开文件的句柄
pliFileSize 一个LARGE_INTEGER联合类型的地址。这个联合允许我们以一个64位有符号数的形式来引用一个64位有符号数,或者以两个32位值的形式来引用一个64位有符号数。
实例:
1 BOOL bResult = GetFileSizeEx(hHandle, &liFileSize); 2 printf("%lld bytes\n%4.2f KB\n%4.2f MB\n%4.2f GB\n", liFileSize.QuadPart, (float)liFileSize.QuadPart / 1024, (float)liFileSize.QuadPart / (1024 * 1024), (float)liFileSize.QuadPart / (1024 * 1024 * 1024));
2. GetCompressedFileSize()获取文件物理大小
GetCompressedFileSize函数通过一种不同寻常的方式来返回64位的文件大小:文件大小的低32位是函数的返回值,文件大小的高32位值被放在pdwFileSizeHigh参数指向的DWORD中。
函数原型:
1 DWORD GetCompressedFileSize( 2 PCTSTR pszFileName, 3 PDWORD pdwFileSizeHigh);
pszFileName 传入一个字符串形式的文件名地址
pdwFileSizeHigh 放置文件大小的高32 位值的变量指针
实例:
1 ULARGE_INTEGER uliFileSize; 2 uliFileSize.LowPart = GetCompressedFileSize(TEXT("SomeFile.dat"),&uliFileSize.HighPart); 3 printf("%lld bytes\n%4.2f KB\n%4.2f MB\n%4.2f GB\n", uliFileSize.QuadPart, (float)uliFileSize.QuadPart / 1024, (float)uliFileSize.QuadPart / (1024 * 1024), (float)uliFileSize.QuadPart / (1024 * 1024 * 1024)); 4 // 64-bit file size is now in uliFileSize.QuadPart
3. SetEndOfFile()设置文件大小
函数原型:
BOOL SetEndOfFile(HANDLE hFile);
SetEndOfFile函数会根据文件对象的文件指针当前所在的位置来截断文件的大小或增大文件的大小。文件指针是相对于文件起始位置的一个64位的偏移量,指向下一次同步读取或写入操作的位置,详情请穿越到http://www.cnblogs.com/bigsponge/articles/4950384.html。
例如:如果想将文件的大小强制设为1024,可以像下面这样使用
1 HANDLE hFile = CreateFile(...); 2 LARGE_INTEGER liDistanceToMove; 3 liDistanceToMove.QuadPart = 1024; 4 SetFilePointerEx(hFile, liDistanceToMove, NULL, FILE_BEGIN); 5 SetEndOfFile(hFile); 6 CloseHandle(hFile);