有關(guān)做甜點(diǎn)的網(wǎng)站公司網(wǎng)站制作費(fèi)用
????????基本是由百度Ai寫代碼生成的,記錄一下。實(shí)現(xiàn)此功能需要調(diào)用系統(tǒng)的API函數(shù)。
????????對(duì)于Windows,可調(diào)用函數(shù)GetDiskFreeSpaceEx,使用該函數(shù)需要包含頭文件windows.h。該函數(shù)的原型:
????????它的四個(gè)參數(shù):
lpDirectoryName(入?yún)?#xff09;:磁盤上的一個(gè)目錄。此參數(shù)不是必須要傳遞磁盤分區(qū)的根目錄。比如我要判斷D盤的空間是否充足,傳遞D盤根目錄路徑或者D盤任一個(gè)目錄的路徑都是可以的。如果傳遞NULL,表示當(dāng)前磁盤分區(qū)的根目錄路徑。如果傳遞一個(gè)UNC name,則必須包含尾部的反斜杠,例如:"\\MyServer\MyShare\"。
lpFreeBytesAvailableToCaller(出參):一個(gè)變量的指針,此變量接收指定的磁盤分區(qū)上,與調(diào)用線程相關(guān)聯(lián)的用戶,可使用的可用字節(jié)總數(shù)。如不需要接收,可傳為NULL。
lpTotalNumberOfBytes(出參):一個(gè)變量的指針,此變量接收指定的磁盤分區(qū)上,與調(diào)用線程相關(guān)聯(lián)的用戶,可使用的總字節(jié)數(shù)。如不需要接收,可傳為NULL。
lpTotalNumberOfFreeBytes(出參):一個(gè)變量的指針,此變量接收指定的磁盤分區(qū)上的空閑字節(jié)總數(shù)。如不需要接收,可傳為NULL。
? ? ? ? 我的需求是判斷程序當(dāng)前所在的磁盤分區(qū)的空間是否充足,因此lpDirectoryName可以傳為NULL,結(jié)合百度AI生成的代碼,真正需要接收的是lpTotalNumberOfFreeBytes,因此將lpFreeBytesAvailableToCaller和lpTotalNumberOfBytes也傳為NULL。而lpTotalNumberOfFreeBytes的類型是ULARGE_INTEGER,它是一個(gè)聯(lián)合
微軟官方的解釋:
由于我的編譯器是支持64位整型的。因此使用成員QuadPart返回空閑字節(jié)數(shù)。將判斷磁盤空間是否充足的功能封裝成一個(gè)函數(shù),調(diào)用此函數(shù)時(shí)傳遞我們?cè)O(shè)定的磁盤空間大小。如果磁盤空間的空閑字節(jié)數(shù)不小于設(shè)定值,判定為空間充足,反之判定為空間不足。如果獲取空閑字節(jié)數(shù)失敗也判定為空間不足。Windows的代碼:
#include <iostream>
#include <windows.h>using namespace std;/// <summary>
/// 判斷指定的磁盤分區(qū)的剩余空間是否充足
/// 剩余空間不小于設(shè)定的最小值判定為空間充足,否則為空間不足
/// </summary>
/// <param name="minFreeSpace">剩余空間設(shè)定的最小值</param>
/// <returns>剩余空間是否充足</returns>
bool isDiskSpaceSufficient(unsigned __int64 minFreeSpace) {ULARGE_INTEGER totalFreeBytes;// 本磁盤分區(qū)的空閑字節(jié)數(shù)if (GetDiskFreeSpaceEx(NULL, NULL, NULL, &totalFreeBytes)) { cout << "本磁盤分區(qū)的空閑字節(jié)數(shù):" << totalFreeBytes.QuadPart << endl;return totalFreeBytes.QuadPart >= minFreeSpace;}else {cerr << "獲取當(dāng)前磁盤分區(qū)的空閑大小失敗!" << endl;return false;}
}int main(void) {unsigned __int64 minFreeSpace = 1024 * 1024 * 1024;// 磁盤分區(qū)的最小空間(字節(jié)),小于此值認(rèn)為空間不足if (isDiskSpaceSufficient(minFreeSpace))cout << "當(dāng)前磁盤分區(qū)空間充足。" << endl;elsecout << "當(dāng)前磁盤分區(qū)空間不足。" << endl;return 0;
}
? ? ? ? 對(duì)于Linux,可以調(diào)用函數(shù)statvfs(),調(diào)用它需要包含頭文件sys/statvfs.h,該函數(shù)的原型:
int statvfs(const char *path, struct statvfs *buf);
參數(shù)path是要獲取磁盤信息的路徑,參數(shù)buf是statvfs結(jié)構(gòu)體的指針。如果獲取信息成功,函數(shù)返回0;獲取失敗返回-1。
????????獲取到的磁盤信息將存放到statvfs結(jié)構(gòu)體buf中,該結(jié)構(gòu)體的成員:
成員f_bfree表示空閑塊的數(shù)量,f_bavail表示非特權(quán)用戶的空閑塊數(shù)量,f_bsize表示文件系統(tǒng)塊的大小??臻e塊數(shù)乘以塊大小就是磁盤的空閑空間。關(guān)于空閑塊數(shù),由于我是用普通用戶來(lái)執(zhí)行程序,因此我用的是f_bavail,而不是f_bfree。
? ? ? ? 另外,需要調(diào)用函數(shù)getcwd()獲取程序當(dāng)前的工作目錄,然后將其傳給statvfs()的參數(shù)path。使用此函數(shù)需要包含頭文件unistd.h,該函數(shù)原型:
char *getcwd(char *buf,?size_t?size);
獲取到的目錄的絕對(duì)路徑將保存到參數(shù)buf中,參數(shù)size是buf的大小。獲取成功后,函數(shù)會(huì)返回buf的指針,獲取失敗則返回NULL。Linux的代碼:
#include <iostream>
#include <sys/statvfs.h>
#include <unistd.h>
#include <limits.h>
#include <cstring>using namespace std;/// <summary>
/// 判斷磁盤空間是否充足
/// </summary>
/// <param name="requiredSpace">需要的最小磁盤空間(字節(jié))</param>
/// <returns>磁盤空間是否充足</returns>
bool isDiskSpaceSufficient(unsigned long long requiredSpace)
{struct statvfs fs_info;// 文件系統(tǒng)信息char cwd[PATH_MAX];// 程序當(dāng)前工作目錄memset(cwd, 0, PATH_MAX);// 獲取程序當(dāng)前工作目錄// 若獲取失敗不再繼續(xù)判斷磁盤空間是否充足,直接按空間不足返回if (!getcwd(cwd, sizeof(cwd))) {cerr << "獲取程序當(dāng)前工作目錄失敗。" << endl;return false;}// 獲取文件系統(tǒng)信息// 若獲取失敗不再繼續(xù)判斷空間是否充足,直接按空間不足返回if (statvfs(cwd, &fs_info)){cerr << "獲取文件系統(tǒng)信息失敗。" << endl;return false;}// 判斷磁盤空間是否充足unsigned long long availableSpace = (unsigned long long)(fs_info.f_bavail * fs_info.f_bsize);cout << "磁盤可用空間: " << availableSpace << "字節(jié)。" << endl;return availableSpace >= requiredSpace;
}int main(void)
{unsigned long long requiredSpace = 1024 * 1024 * 1024; // 需要的最小空間(字節(jié))// 判斷程序工作目錄的磁盤空間是否充足if (isDiskSpaceSufficient(requiredSpace)) cout << "磁盤空間充足。" << endl;else cout << "磁盤空間不足。" << endl;return 0;
}
參考文章:
GetDiskFreeSpaceExW function (fileapi.h):https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdiskfreespaceexw
ULARGE_INTEGER union (winnt.h):
https://learn.microsoft.com/zh-cn/windows/win32/api/winnt/ns-winnt-ularge_integer-r1
Linux statvfs()獲取系統(tǒng)磁盤信息:https://www.cnblogs.com/fortunely/p/17212612.html
getcwd:https://baike.baidu.com/item/getcwd/4746955?fr=ge_ala
getcwd函數(shù):https://wenku.baidu.com/view/d92bfe6b084e767f5acfa1c7aa00b52acfc79cb5.html?_wkts_=1719541905888&bdQuery=getcwd%E5%87%BD%E6%95%B0