1、CreateFile获取文件的内核对象
2、SetFilePointerEx 移动文件指针到文件头,因为前面ReadFile读取文件的时候会移动文件指针,这里移动了20byte
3、GetFileSizeEx获取文件的逻辑大小
4、GetCompressedFileSize获取文件的物理大小,这个比较有意思的地方就是这个函数的额第二个参数和返回值:
ULARGE_INTEGER定义的是一个64位的无符号数,这个函数的第二个参数就是这个无符号数的高32位,返回值是低32位。
Windows可以处理很大的文件,可达到16EB,但是现实中的文件不可能这么大,所以高32位基本上都是0;
与之对应的GetFileSizeEx的第二个参数是一个有符号的64位值。
int main()
{
HANDLE handle = CreateFile(TEXT("D:\\testfile\\2.txt"), GENERIC_READ | GENERIC_WRITE, NULL,NULL,OPEN_EXISTING,NULL,NULL);
if (handle == INVALID_HANDLE_VALUE)
return -1;
DWORD type = GetFileType(handle);
cout << type << endl; // 1
BYTE pb[10];
DWORD dwNumberBytes;
ReadFile(handle, pb, 10, &dwNumberBytes, NULL); //read 0-9 byte
ReadFile(handle, pb, 10, &dwNumberBytes, NULL); //read 10-19 byte
LARGE_INTEGER liDistanceToMove;
liDistanceToMove.QuadPart = 102400;
SetFilePointerEx(handle, liDistanceToMove, NULL, FILE_BEGIN); //move file pointer
SetEndOfFile(handle);
LARGE_INTEGER fileSize;
GetFileSizeEx(handle, &fileSize); //logical size
cout << "filesize:" << fileSize.HighPart <<" " << fileSize.LowPart << endl; //filesize:0 102400
CloseHandle(handle);
ULARGE_INTEGER uFileSize;
uFileSize.LowPart = GetCompressedFileSize(L"D:\\testfile\\2.txt", &uFileSize.HighPart); //physical size
cout << "uFileSize:" << uFileSize.HighPart << " " << uFileSize.LowPart << endl; //uFileSize:0 102400
}