C/C++ Windows API——獲取磁碟資訊
阿新 • • 發佈:2019-01-07
// LogicalDrive.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
//將PULARGE_INTEGER型別的位元組(B)數轉化為(GB)單位
#define GB(x) (x.HighPart << 2) + (x.LowPart >> 20) / 1024.0
int main()
{
int driveCount = 0;
char szDriveInfo[16 + 1] = {0};
/*
獲取主機中所有的邏輯驅動器字母,以BitMap的形式返回
DWORD GetLogicalDrives();
return 一個DWORD型別的值,第一位表示所對應的驅動器是否存在。一般情況下DWORD的資料長度是32位,在這個DWORD中,每一位對應了一個邏輯驅動器是否存在。第二位如果是“1”則表示驅動器“B:”存在,第四位如果是“1”則表示驅動器“D:”存在,以此類推
*/
DWORD driveInfo = GetLogicalDrives();
_itoa_s(driveInfo, szDriveInfo, 2);
printf("GetLogicalDrives -> %016s\n", szDriveInfo);
while (driveInfo) {
if (driveInfo & 1) {
driveCount++;
}
driveInfo >>= 1;
}
printf("LogicalDriveCount = %d \n", driveCount);
/*
獲取一個字串,其中包含了當前所有邏輯驅動器的根驅動器路徑。
DWORD GetLogicalDriveStrings(
DWORD nBufferLength, // size of buffer, 如果是此引數為0 後面的lpBuffer則不使用
LPTSTR lpBuffer // drive strings buffer, 用於裝載邏輯驅動器名稱的字串。每個名字都用一個NULL字元分隔,在最後一個名字後面用兩個NULL表示中止(空中止) 例如A:\<null>C:\<null><null>
);
return
返回填充完畢的緩衝區字元的的個數..不是長度..char和TCHAR 返回數目都是一樣的..
一般是4的倍數...(形如C:\ 包括之後的一個空字元0)..
如果緩衝區不夠大,則返回值大於nBufferLength
如果失敗..函式返回0..若想獲得更多的錯誤資訊,請使用GetLastError函式
*/
int driveStrLen = GetLogicalDriveStrings(0, NULL);
printf("GetLogicalDriveStrings -> %d\n\n", driveStrLen);
//exception must have a constant value
//char driveStr[driveStrLen];
TCHAR *driveStr = new TCHAR[driveStrLen];
GetLogicalDriveStrings(driveStrLen, driveStr);
TCHAR *lpDriveStr = driveStr;
for (int i = 0; i < driveCount; i++) {
/*
獲取磁碟型別
UINT GetDriveType(
_In_opt_ LPCWSTR lpRootPathName //不包括卷名的磁碟根路徑名
);
#define DRIVE_UNKNOWN 0
#define DRIVE_NO_ROOT_DIR 1
#define DRIVE_REMOVABLE 2
#define DRIVE_FIXED 3
#define DRIVE_REMOTE 4
#define DRIVE_CDROM 5
#define DRIVE_RAMDISK 6
*/
UINT driveType = GetDriveType(lpDriveStr);
char *szDriveTypeArr[] = {
"DRIVE_UNKNOWN",
"DRIVE_NO_ROOT_DIR",
"DRIVE_REMOVABLE",
"DRIVE_FIXED",
"DRIVE_REMOTE",
"DRIVE_CDROM",
"DRIVE_RAMDISK"
};
ULARGE_INTEGER freeBytesAvailableToCaller;
ULARGE_INTEGER totalNumberOfBytes;
ULARGE_INTEGER totalNumberOfFreeBytes;
/*
獲取與一個磁碟的型別以及剩餘空間容量有關的資訊
BOOL GetDiskFreeSpaceExW(
_In_opt_ LPCWSTR lpDirectoryName, //不包括卷名的磁碟根路徑名
_Out_opt_ PULARGE_INTEGER lpFreeBytesAvailableToCaller, //磁碟的可用位元組數
_Out_opt_ PULARGE_INTEGER lpTotalNumberOfBytes, //磁碟的總位元組數
_Out_opt_ PULARGE_INTEGER lpTotalNumberOfFreeBytes //磁碟的剩餘位元組數
);
*/
GetDiskFreeSpaceEx(lpDriveStr, &freeBytesAvailableToCaller, &totalNumberOfBytes, &totalNumberOfFreeBytes);
printf("GetLogicalDriveStrings -> %ls\n", lpDriveStr);
printf("GetDriveType -> %d=%s\n", driveType, szDriveTypeArr[driveType]);
printf("GetDiskFreeSpaceEx -> Available=%f, Total=%f, free=%f\n\n", GB(freeBytesAvailableToCaller), GB(totalNumberOfBytes), GB(totalNumberOfFreeBytes));
lpDriveStr += 4;
}
delete driveStr;
system("pause");
return 0;
}