標籤:
Windows最初的設計允許我們處理非常大的檔案,所以最初的設計者選用64位值來表示檔案大小。但是我們在日常處理過程中檔案大小一般不會超過4GB。故Windows提供了兩個等位型別的資料結構表示檔案大小。
//64位有符號形式
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart; //低位元組,32位無符號數
LONG HighPart; //高位元組,32位有符號數
};
LONGLONG QuadPart; //64位有符號數
} LARGE_INTEGER, *PLARGE_INTEGER;
//64位無符號形式
typedef union _ULARGE_INTEGER {
struct {
DWORD LowPart; //低位元組,32位無符號數
DWORD HighPart; //高位元組,32位無符號數
};
ULONGLONG QuadPart; //64位無符號數
} ULARGE_INTEGER, *PULARGE_INTEGER;
1. 擷取檔案的邏輯大小
BOOL GetFileSizeEx(
HANDLE hFile; //已開啟的檔案控制代碼
PLARGE_INTEGER pliFileSize; //64位有符號形式檔案大小結構指標
);
2. 擷取檔案的物理大小
DWORD GetCompressedFileSize(
PCTSTR pszFileName; //檔案路徑字串
PDWORD pdwFileSizeHigh; //指向儲存檔案大小高32位值的指標
);
檔案返回64位無符號形式的檔案大小,檔案大小的低32值通過傳回值返回,高32位值儲存在參數pdwFileSizeHigh指向的DWORD中。使用ULARGE_INTEGER結構擷取物理檔案大小的方式如下:
ULARGE_INTEGER ulFileSize;
ulFileSize.LowPart = GetCompressedFileSize(TEXT("SomeFile.dat"),
&ulFileSize.HighPart);
64位無符號檔案大小就儲存到 ulFileSize.QuadPart中了。
3. 邏輯大小與物理大小的區別
舉個例子,假設一個檔案的邏輯大小為100KB經過壓縮之後只佔用85KB物理空間,那麼調用GetFileSizeEx返回的大小就是100KB,而調用GetCompressedFileSize返回的是檔案在磁碟上實際佔用的位元組數85KB。
Windows擷取檔案大小