对硬盘操作的API介绍以及应用测试

磁盘和驱动器管理API
GetLogicalDrivers获取主机中所有的逻辑驱动器,以BitMap的形式返回.
GetLogicalDriverString获取主机中所有的逻辑驱动器,以驱动器根路径字符串返回.
FindFirstVolume查找主机中的第一个驱动器,返回查找句柄.
FindNextVolume根据FindFirstVolume返回句柄,查找主机中后继的逻辑驱动器
FindVolumeClose关闭驱动器查找句柄
GetDriveType获取驱动器类型
GetVolumeInformation获取逻辑驱动器信息
FindFirstVolumeMountPoint查找指定卷的第一个挂载点,返回查找句柄
FindNextVolumeMountPoint 根据FindFirstVolumeMountPoint返回的句柄,查找卷的后继挂载点.
FindVolumeMountPointClose 关闭挂载点查找句柄
GetVolumeNameForVolumeMountPoint 根据指定挂载点获取相应的卷设备名
SetVolumeMountPoint将指定卷挂载到指定挂载点处
GetDiskFreeSpace获取磁盘空间信息,包括每簇的扇区数,每扇区的字节数,簇数量,空闲的簇数量
GetDiskFreeSpaceEx获取用户可用的空闲空间的字节数,磁盘总容量的字节数



原型:DWORD GetLogicalDrivers (void);
说明:函数返回值是一个long型,将其用二进制显示时,其中第0位表示A盘,第1位表示B盘,当某位为1时说明存在这个盘,即00000011表示有A盘和B盘。
对硬盘操作的API介绍以及应用测试
文章图片








2:GetLogicalDriverString获取主机中所有的逻辑驱动器,以驱动器根路径字符串返回.


// operation_disk.cpp : Defines the entry point for the console application. //
#include "stdafx.h" #include #include #include #include#include
int _tmain(int argc, _TCHAR* argv[]) { int i=0; TCHAR buff[32] = {0}; DWORD dw=GetLogicalDriveStrings(0,NULL); LPTSTR lpDriveStrings = buff; //=(LPTSTR)HeapAlloc(GetProcessHeap(),0,dw*sizeof(TCHAR)); GetLogicalDriveStrings(dw,lpDriveStrings);
scanf("%d",&i); return 0; }
对硬盘操作的API介绍以及应用测试
文章图片


// operation_disk.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include
#include
#include
#include
#include


int _tmain(int argc, _TCHAR* argv[])
{
int i=0;
TCHAR buff[32] = {0};
char c_buff[32] = {0};
DWORD dw=GetLogicalDriveStrings(0,NULL);
LPTSTR lpDriveStrings = buff; //=(LPTSTR)HeapAlloc(GetProcessHeap(),0,dw*sizeof(TCHAR));
GetLogicalDriveStrings(dw,lpDriveStrings);
memcpy(c_buff,buff,32);
char *p_buff = &c_buff[0];
for(int i = 0; i< 32; i++)
{
printf("%c",*p_buff);
p_buff = &c_buff[i];
//p_buff = NULL;
}

scanf("%d",&i);
return 0;
}
结果:
对硬盘操作的API介绍以及应用测试
文章图片





【对硬盘操作的API介绍以及应用测试】3:FindFirstVolume查找主机中的第一个驱动器,返回查找句柄.


对硬盘操作的API介绍以及应用测试
文章图片

// operation_disk.cpp : Defines the entry point for the console application. //
#include "stdafx.h" #include #include #include #include#include#include //#include




int _tmain(int argc, _TCHAR* argv[]) { int i=2;

DWORDError= ERROR_SUCCESS; HANDLE FindHandle= INVALID_HANDLE_VALUE; BOOLSuccess= FALSE; WCHARVolumeName[MAX_PATH] = L""; //MAX_PATH260 // //Enumerate all volumes in the system. FindHandle = FindFirstVolumeW(VolumeName, ARRAYSIZE(VolumeName)); if (FindHandle == INVALID_HANDLE_VALUE) { Error = GetLastError(); wprintf(L"FindFirstVolumeW failed with error code %d\n", Error); return -1; } printf("查找到的第一个卷的GUID路径为:\n"); for (int i=0; i<256; i++) { printf("%c",VolumeName[i]); }
while(1) { memset(VolumeName, 0 , ARRAYSIZE(VolumeName)); Success = FindNextVolumeW(FindHandle, VolumeName, ARRAYSIZE(VolumeName)); if ( !Success ){ Error = GetLastError(); if (Error != ERROR_NO_MORE_FILES){ wprintf(L"FindNextVolumeW failed with error code %d\n", Error); break; } break; } printf("查找到的第[%d]个卷的GUID路径为:\n",i); i++; for (int i=0; i<256; i++) { printf("%c",VolumeName[i]); } } FindVolumeClose(FindHandle); //关闭驱动器查找句柄





scanf("%d",&i); return 0; }

4:GetDriveType获取驱动器类型
对硬盘操作的API介绍以及应用测试
文章图片


对硬盘操作的API介绍以及应用测试
文章图片


对硬盘操作的API介绍以及应用测试
文章图片



// operation_disk.cpp : Defines the entry point for the console application. //
#include "stdafx.h" #include #include #include #include#include#include //#include

void rew(UINT bResult) { switch(bResult) { case DRIVE_UNKNOWN:printf("可获得驱动器类型为【无法识别的设备】\n", bResult); break; case DRIVE_NO_ROOT_DIR:printf("可获得驱动器类型为【给出的名字不存在,不存在的驱动器】\n", bResult); break; case DRIVE_REMOVABLE:printf("可获得驱动器类型为【可移动设备】\n", bResult); break; case DRIVE_FIXED:printf("可获得驱动器类型为【不可移动的磁盘】\n", bResult); break; case DRIVE_REMOTE:printf("可获得驱动器类型为【网络硬盘】\n", bResult); break; case DRIVE_CDROM:printf("可获得驱动器类型为【CD光驱】\n", bResult); break; case DRIVE_RAMDISK:printf("可获得驱动器类型为【内存虚拟盘】\n", bResult); break; default: printf("programError\n"); break; } }


int _tmain(int argc, _TCHAR* argv[]) { int i=0;

UINT bResult = 0; LPCTSTR buff = _T("c:\\");
//使用GetDiskFreeSpaceEx获取磁盘信息并打印结果bResult = GetDriveType (buff); printf("C盘:"); rew(bResult);
bResult = GetDriveType (_T("d:\\")); printf("D盘:"); rew(bResult);
bResult = GetDriveType (_T("e:\\")); printf("E盘:"); rew(bResult);
bResult = GetDriveType (_T("f:\\")); printf("F盘:"); rew(bResult);
bResult = GetDriveType (_T("g:\\")); printf("G盘:"); rew(bResult);
bResult = GetDriveType (_T("h:\\")); printf("H盘:"); rew(bResult);


scanf("%d",&i); return 0; }

5:GetDiskFreeSpaceEx获取用户可用的空闲空间的字节数,磁盘总容量的字节数
对硬盘操作的API介绍以及应用测试
文章图片



// operation_disk.cpp : Defines the entry point for the console application. //
#include "stdafx.h" #include #include #include #include#include#include //#include
int _tmain(int argc, _TCHAR* argv[]) { int i=0;

DWORD64 qwFreeBytesToCaller = 0, qwTotalBytes = 0, qwFreeBytes = 0; DWORD dwSectPerClust = 0, dwBytesPerSect = 0, dwFreeClusters = 0,dwTotalClusters = 0; BOOL bResult = 0;
//使用GetDiskFreeSpaceEx获取磁盘信息并打印结果bResult = GetDiskFreeSpaceEx (_T("c:\\"),(PULARGE_INTEGER)&qwFreeBytesToCaller,(PULARGE_INTEGER)&qwTotalBytes,(PULARGE_INTEGER)&qwFreeBytes);
printf("可获得的空闲空间(GB): \t%I64d\n", qwFreeBytesToCaller/(1024*1024*1024)); printf("空闲空间(字节): \t\t%I64d\n", qwFreeBytes); printf("磁盘总容量(字节): \t\t%I64d\n", qwTotalBytes);
scanf("%d",&i); return 0; }

6:GetDiskFreeSpace获取磁盘空间信息,包括每簇的扇区数,每扇区的字节数,簇数量,空闲的簇数量



对硬盘操作的API介绍以及应用测试
文章图片

// operation_disk.cpp : Defines the entry point for the console application. //
#include "stdafx.h" #include #include #include #include#include#include
int _tmain(int argc, _TCHAR* argv[]) { int i=0;

DWORD dSectorsPerCluster=0; //每簇的扇区数 DWORD dBytesPerSector=0; //每个扇区的字节数 DWORD dNumberOfFreeClusters=0; //可用簇数 DWORD dTotalNumberOfClusters=0; //总的簇数 LPCWSTR pc = 0; if (GetDiskFreeSpace(_T("c:\\"),&dSectorsPerCluster,&dBytesPerSector,&dNumberOfFreeClusters,&dTotalNumberOfClusters)){ printf("每蔟的扇区数为%d\n",dSectorsPerCluster); printf("每个扇区的字节数为%d\n",dBytesPerSector); printf("可用簇数为%d\n",dNumberOfFreeClusters); printf("总的簇数为%d\n",dTotalNumberOfClusters); }else{ printf("error"); }
scanf("%d",&i); return 0; }



7:GetVolumeInformation获取硬盘信息

对硬盘操作的API介绍以及应用测试
文章图片


// operation_disk_mfc.cpp : Defines the entry point for the console application. //
#include "stdafx.h" #include "operation_disk_mfc.h"
#ifdef _DEBUG #define new DEBUG_NEW #endif

// The one and only application object
CWinApp theApp;
using namespace std;






int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0;
HMODULE hModule = ::GetModuleHandle(NULL);
if (hModule != NULL) { // initialize MFC and print and error on failure if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0)) { // TODO: change error code to suit your needs _tprintf(_T("Fatal Error: MFC initialization failed\n")); nRetCode = 1; } else { // TODO: code your application's behavior here.
int i; /*LPWSTR lpVolumeNameBuffer = 0; LPDWORDSerialNumber = 0; DWORD nVolumeNameSize = 0; GetVolumeInformation( _T("c:"),lpVolumeNameBuffer,255,SerialNumber,&MaxCLength,&FileSysFlag,FileSysName,255); */ DWORDVolumeSerialNumber = 0; TCHARVolumeName[256] = _T(""); if (GetVolumeInformation( _T("d:\\"),VolumeName,12,&VolumeSerialNumber,NULL,NULL,NULL,10) < 0) { printf("D盘error\n"); } printf( "D盘的序列号:%lu\n ",VolumeSerialNumber);
VolumeSerialNumber = 0; if (GetVolumeInformation( _T("c:\\"),VolumeName,12,&VolumeSerialNumber,NULL,NULL,NULL,10) < 0) { printf("c盘error\n"); } printf( "C盘的序列号:%lu\n ",VolumeSerialNumber);
scanf("%d",&i); } } else { // TODO: change error code to suit your needs _tprintf(_T("Fatal Error: GetModuleHandle failed\n")); nRetCode = 1; }
return nRetCode; }


8:


































































































































    推荐阅读