GetDiskFreeSpace 和 GetDiskFreeSpaceEx
文章目錄
- GetDiskFreeSpace
- 函數聲明
- 函數功能
- 第一個參數:
- 第二個參數:
- 第三個參數:
- 第四個參數:
- 第五個參數:
- 返回值
- 補充
- 代碼實現
- GetDiskFreeSpaceEx
- 函數聲明
- 函數功能
- 第一個參數
- 第二個參數
- 第三個參數
- 第四個參數
- 返回值
- 代碼實現
- 補充:
GetDiskFreeSpace
函數聲明
BOOL GetDiskFreeSpace(LPCTSTR lpRootPathName, //rootpathLPDWORD lpSectorsPerCluster, //sectorsperclusterLPDWORD lpBytesPerSector ,//bytespersectorLPDWORD lpNumberOfFreeClusters, //freeclustersLPDWORD lpTotalNumberOfClusters //totalclusters);函數功能
獲取與一個磁盤的組織有關的信息,以及了解剩余空間的容量。該函數是獲取指定磁盤的信息(包括剩余空間的信息),函數不能獲取到卷的大小超過2GB的磁盤的信息,如果要獲得可以使用GetDiskFreeSpaceEx函數;來實現
第一個參數:
pRootPathName輸入參數,磁盤的根目錄,如果設置為空,函數就使用 當前目錄作為這個參數傳入,如果指定的是一個UNC名的話,文件名的最后必須帶上一個反斜杠
第二個參數:
lpSectorsPerCluster,輸出參數,指定每個簇的扇區數目
第三個參數:
lpBytesPerSector輸出參數, 指定每個扇區的字節數目
第四個參數:
lpNumberOfFreeClusters輸出參數, 磁盤總的空閑簇數目
第五個參數:
lpTotalNumberOfClusters 輸出參數,磁盤總的簇數目
返回值
調用成功 將返回一個非0值
調用不成功 返回0 可以通過GetLastError來獲得錯誤信息
補充
簇 - 文件系統用來管理文件數據的最小單位。
每一個簇都是由連續的幾個 扇區組成,例如
通常是由1/2/4/8/16… 扇區組成。
FAT16/32 - 4K、8K
NTFS - 4K
全部空間(TotalLetfSize) = 總簇數量 * 每簇的扇區數 * 每扇區字節數。
剩余空間(TotalLetfSize) = 空余簇數量 * 每簇的扇區數 * 每扇區字節數。
代碼實現
BOOL bResult;DWORD dwTotalClusters;DWORD dwFreeClusters;DWORD dwSectPerClust;DWORD dwbytesPerSect;bResult = GetDiskFreeSpace(TEXT("c:"), &dwSectPerClust, &dwbytesPerSect, &dwFreeClusters, &dwTotalClusters);if (bResult) {printf("\n使用 GetDiskFreeSpace獲取磁盤空間信息\n");printf("總簇數量:\t\t\t%I64d\n",dwTotalClusters);printf("空閑的簇數量:\t\t\t%I64d\n", dwFreeClusters);printf("每簇的扇區數量:\t\t\t%I64d\n", dwSectPerClust);printf("每扇區的字節數:\t\t\t%I64d\n", dwbytesPerSect);printf("磁盤總容量:\t\t\t%I64d\n", (DWORD64)dwTotalClusters* (DWORD64)dwSectPerClust* (DWORD64)dwbytesPerSect);printf("磁盤空閑容量:\t\t\t%I64d\n", (DWORD64)dwFreeClusters * (DWORD64)dwSectPerClust * (DWORD64)dwbytesPerSect);}GetDiskFreeSpaceEx
GetDiskFreeSpaceEx(TEXT("c:"),(PULARGE_INTEGER)&qwFreeBytesTocaller,(PULARGE_INTEGER)&qwTotalBytes,(PULARGE_INTEGER)&qwFreeBytes);函數聲明
BOOL GetDiskFreeSpaceEx( LPCWSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailableToCaller, PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes );函數功能
可以得到驅動器的簇信息,剩余空間以及總大小。
第一個參數
lpDirectoryName,輸入參數,磁盤的根目錄,如果設置為空,函數就使用 當前目錄作為這個參數傳入,如果指定的是一個UNC名的話,文件名的最后必須帶上一個反斜杠
第二個參數
lpFreeBytesAvailableToCaller指定一個變量,用于容納 調用者 可用的字節數量
第三個參數
lpTotalNumberOfBytes指定一個變量,用于容納磁盤上的總字節數
第四個參數
lpTotalNumberOfFreeBytes指定一個變量,用于容納磁盤上可用的字節數
返回值
Long,非零表示成功,零表示失敗。會設置GetLastError
代碼實現
DWORD64 qwFreeBytes, qwFreeBytesTocaller, qwTotalBytes;bResult = GetDiskFreeSpaceEx(TEXT("c:"),(PULARGE_INTEGER)&qwFreeBytesTocaller,(PULARGE_INTEGER)&qwTotalBytes,(PULARGE_INTEGER)&qwFreeBytes);if (bResult) {printf("\n使用GetDiskFreeSpaceEx獲取磁盤空間信息\n");printf("磁盤總容量:\t\t\t%I64d\n",qwTotalBytes );printf("可用的磁盤空閑容量:\t\t\t%I64d\n",qwFreeBytes );printf("磁盤空閑容量:\t\t\t%I64d\n", qwFreeBytesTocaller);}把兩個函數一起運行一下,看看是否數據相等:
查看了一下,完全一樣,到這里呢,game over!!
補充:
講一下PULARGE_INTEGER。我們這個函數得到的信息是磁盤的總大小、當前用戶可操作大小、剩余磁盤空間,單位是字節。但是在我的電腦上int 以及 long int都是4個字節,也就是最大(無符號)能存是數232字節,等于4G左右,顯然已經不夠了,現在隨意一個分區就是幾百G。所以這個函數用了一個特別的方法,即用一個聯合,里面保存著一個結構體,而結構體里面有兩個32位的整數,分別表示該數的上半部分和下半部分。于是就可以表示出一個64位的整數了。
typedef union _ULARGE_INTEGER {struct {DWORD LowPart;DWORD HighPart;} u;ULONGLONG QuadPart; } ULARGE_INTEGER, *PULARGE_INTEGER;PULARGE_INTEGER其實指向的是這個聯合,這個聯合中的結構體中的LowPart表示低32位,HighPart表示高32位。
不過輸出得到的是一大串數字(因為是以字節為單位),如果我們想以MB或GB為單位怎么辦呢?直接拿TotalNumberOfBytes/1024/1024,發現編譯會報錯。你拿一個聯合去和一個整數做除法運算,肯定報錯。
int Total = (TotalNumberOfBytes.u.HighPart << 12) + (TotalNumberOfBytes.u.LowPart >> 20);將高32位向左移12位,將低32位向右移20位,再相加,目的是什么?先看將LowPart向右移20位,剩下的其實就是LowPart的左12位。因為我們要得到以MB為單位,而1MB是2^20字節,所以只保留LowPart的左12位。而HighPart的所有位都應該保留,所以要放在第13位以后,故HighPart左移12位,最后相加
最后Total再想轉換成GB就除以1024.0就可以。
注意: LARGE_INTEGER結構與FILETIME結構在內部完全一致。正式調用前,用GetVersionEx判斷函數是否得到了支持。在Windows 95 OSR2環境中,OSVERSIONINFO結構的dwBuildNumbe字段會大于1000
備注:
2021年堅持學寫博客第9天(學習兩個windows API) 尋夢SS
明日目標:
windows核心編程API函數
總結
以上是生活随笔為你收集整理的GetDiskFreeSpace 和 GetDiskFreeSpaceEx的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GetLogicalDrives
- 下一篇: CreateDirectory Ge