日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GetDiskFreeSpace 和 GetDiskFreeSpaceEx

發布時間:2025/3/21 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。