一、概述
1.基本概念
(1)磁盤分區(Partitions)
(2)卷(Volumes):是存儲設備上有文件系統管理區域的一塊區域,是在邏輯上的相互隔離的存儲單元。
2.文件系統的主要API
(1)磁盤和驅動器管理類API
(2)文件和目錄管理
(3)高級文件系統操作
二、磁盤和驅動器管理
1.遍歷卷並獲取屬性
獲取一個主機上的所有驅動器列表有兩種方法,一種是使用GetLogicalDrives或GetLogicalDrivesStrings;另一種是使用FindNextVolume組合。
(1)GetLogicalDrives
功能:獲取主機中所有的邏輯驅動器,以Bitmap的形式返回
函數原型:DWORD GetLogicalDrives(void);
返回值:GetLogicalDrives返回一個DWORD類型的值,第一位表示所對應的驅動器是否存在。
(2)GetLogicalDrivesStrings
功能:獲取主機中所有的邏輯驅動器,以驅動器根路徑字符串返回。
函數原型:DWORD GetLogicalDrivesStrings(
DWORD nBufferLength,
LPTSTR lpBuffer //函數的返回結果存在lpBuffer所指向的內存區域中
);
參數:
nBufferLength:參數lpBuffer所指向的內存空間的大小,以字節為單位。
lpBuffer:指向存儲返回結果字符串的內存空間。
返回值:
函數的返回值指明函數調用是否成功,如果成功則為緩存區中返回結果的總長度。如果返回值大於nBufferLength,說明給定的緩沖區大小不夠,返回值是實際需要的大小。如果返回0,則說明函數運行出錯。
(3)FindFirstVolume
功能:查找主機中的第一個驅動器,返回驅動器設備名
函數原型:
HANDLE FindFirstVolume(
LPTSTR lpszVolumName,
DWORD cchBufferLength
);
參數:
lpszVolumName:指向驅動器名的內存緩沖區。
cchBufferLength:參數lpszVolumName所指向的緩沖區大小,以字節為單位。
返回值:
驅動器查找句柄,可作為FindNextVolume和FindVolumeClose的參數,如果執行失敗,返回NULL。
(4)FindNextVolume
功能:查找主機後繼的邏輯驅動器
BOOL FindNextVolume(
HANDLE hFindVolume,
LPTSTR lpszVolumeName,
DWORD cchBufferLength
);
參數:
hFileVolume:FindFirstVolume所返回的驅動器查找句柄。
lpszVolumeName:指向保存驅動器的內存緩沖區。
cchBufferLength:參數lpszVolumeName所指向的緩沖區大小,以字節為單位。
返回值:
返回BOOL表示是否成功,如果失敗說明已經查找所有的邏輯驅動器。
(5)FindVolumeClose
功能:關閉FindFirstVolume打開的卷遍歷句柄
函數原型:
BOOL WINAPI FindVolumeClose(
HANDLE hFileVolume
);
參數:
hFindVolume:要關閉的驅動器查找句柄。
返回值:
返回BOOL值表示是否成功關閉句柄。
(6)GetDriveType
功能:獲取驅動器類型
函數原型:
UINT GetDriveType(
LPCTSTR lpRootPathName
);
參數:
lpRootPathName:驅動器根路徑,如“C:\”。
返回值:
驅動器類型,如DRIVE_FIXED表示硬盤,DRIVE_CDROM表示光盤等。
(7)GetVolumeInformation
功能:獲取邏輯驅動器信息
函數原型:
BOOL GetVolumeInfomation(
LPCTSTR lpRootPathName,
LPTSTR lpVolumeNameBuffer,
DWORD nVolumeNameSize,
LPDWORD lpVolumeSerialNumber,
LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags,
LPTSTR lpFileSystemNameBuffer,
DWORD nFileSystemNameSize
);
參數:
lpRootPathName:輸入參數,指向所要獲取屬性的驅動器的根路徑字符串。
lpvolumeNameBuffer:輸出參數,返回驅動器名。
nVolumeNameSize:輸入參數,lpVolumeNameBuffer的內存緩沖區的大小。
lpVolumeSerialNumber:輸出參數,存儲驅動器序列號。
lpMaximumComponentLength:輸出參數,返回文件系統所支持的文件組成部分的最大值。
lpFileSystemFlags:輸出參數,屬性可以用來判斷多種驅動器屬性值,如FILE_VOLUME_QUOTAS表示支持磁盤配額, FILE_SUPPORTS_ENCRYPTION表示文件系統是否是支持EFS加密等。
lpFileSystemNameBuffer:輸出參數,表示文件類型,如“NTFS”,“CDFS”等。
nFileSystemNameSize:lpFileSystemNameBuffer的緩沖區的大小。
返回值:
返回BOOL值,表示信息獲取是否成功。
2.使用GetLogicalDriveStrings獲取驅動器的根路徑
/* **********************************************************
* GetVolumeInfo.c 遍歷驅動器獲取驅動器屬性
* *********************************************************/
/*頭文件*/
#include <
Windows.h>
#include <stdlib.h>
#include <stdio.h>
/*預定義*/
#define BUFSIZE 1024
/*函數申明*/
BOOL GetDirverInfo(LPSTR szDrive);
/* **********************************************************
* 應用程序主函數,遍歷驅動器並調用GetDirverInfo,獲取驅動器屬性
* **********************************************************/
void main(void)
{
CHAR szLogicalDriveStrings[BUFSIZE];
PCHAR szDrive;
ZeroMemory(szLogicalDriveStrings,BUFSIZE);
//獲取邏輯驅動器卷標名
GetLogicalDriveStrings(BUFSIZE - 1,szLogicalDriveStrings);
szDrive = (PCHAR)szLogicalDriveStrings;
//循環處理每個卷
do
{
if (!GetDirverInfo(szDrive))
{
printf("\n Get Volume Infomation Error :%d",GetLastError());
}
szDrive += (lstrlen(szDrive) + 1);
} while (* szDrive != '\x00');
}
3.使用FindFirstVolume系列函數遍歷驅動器,獲取驅動器信息
/* *****************************************************************
* Enumeratevolume.c 遍歷驅動器並獲取驅動器屬性
* ****************************************************************/
#define _WIN32_WINNT 0x0501
/*頭文件*/
#include <Windows.h>
#include <stdio.h>
/*預定義*/
#define BUFSIZE MAX_PATH
/*函數申明*/
BOOL GetDirverInfo(LPSTR szDrive);
/* ******************************************************************
* 功能 :應用程序主函數,遍歷驅動器並調用
* ******************************************************************/
int main(void)
{
TCHAR buf[BUFSIZE];
//卷標信息
HANDLE hVol;
//卷遍歷句柄
BOOL bFlag;
hVol = FindFirstVolume(buf, BUFSIZE);
if (hVol == INVALID_HANDLE_VALUE)
{
printf(TEXT("No Volumes Found!\n"));
return (-1);
}
GetDirverInfo(buf);
while (FindNextVolume(
hVol,
buf,
BUFSIZE
))
{
GetDirverInfo(buf);
}
bFlag = FindVolumeClose(hVol);
return (bFlag);
}
4.調用GetVolumeInformation API函數,獲取驅動器相關屬性
/* ***************************************************
* BOOL GetDirverInfo(LPSTR szDrive)
* 功能:獲取驅動器屬性
* 參數:LPSTR szDrive
指明要獲取屬性的驅動器的根路徑,如C:\
* 返回值BOOL:表示是否成功
* **************************************************/
BOOL GetDirverInfo(LPSTR szDrive)
{
UINT uDriveType;
DWORD dwVolumeSerialNumer;
DWORD dwMaximumComponentLength;
DWORD dwFileSystemFlags;
CHAR szFileSystemNameBuffer[BUFSIZE];
CHAR szDirveName[MAX_PATH];
printf("\n %s \n",szDrive);
uDriveType = GetDriveType(szDrive);
switch(uDriveType)
{
case DRIVE_UNKNOWN:
printf("The drive type cannot be determined.");
break;
case DRIVE_NO_ROOT_DIR:
printf("The root path is invalid ,for example ,no volume is mounted at the path.");
break;
case DRIVE_REMOVABLE:
printf("The drive is a type that has removeble media ,for example ,a floppy drive or removable hard disk.");
break;
case DRIVE_FIXED:
printf("The drive is a type that cannot be removed ,for example ,a fixed hard drive.");
break;
case DRIVE_REMOTE:
printf("The drive is a remote (network) drive.");
break;
case DRIVE_CDROM:
printf("The drive is a CD_ROM drive.");
break;
case DRIVE_RAMDISK:
printf("The drive is a RAM disk.");
break;
default:
break;
}
if (!GetVolumeInformation(
szDrive,
szDirveName,
MAX_PATH,
&dwVolumeSerialNumer,
&dwMaximumComponentLength,
&dwFileSystemFlags,
szFileSystemNameBuffer,
BUFSIZE))
{
return FALSE;
}
if (0 != lstrlen(szDirveName))
{
printf("\n Drive Name is %s\n",szDirveName);
}
printf("\n Volume Serial Number is %u ",dwVolumeSerialNumer);
printf("\n Maxinum component Length is %u",dwMaximumComponentLength);
printf("\nSystem type is %s \n",szFileSystemNameBuffer);
if (dwFileSystemFlags & FILE_SUPPORTS_REPARSE_POINTS)
{
printf("The file system does not support volume volume mount points .\n");
}
if (dwFileSystemFlags & FILE_VOLUME_QUOTAS)
{
printf("The file system supports disk quotas.\n");
}
if (dwFileSystemFlags & FILE_CASE_SENSITIVE_SEARCH)
{
printf("The file system support case-sensitive file name.\n");
}
printf("……\n");
return ture;
}
三、驅動器掛載點
掛載點實際上是
操作系統揮著用戶設置的,用來進入一個邏輯驅動器或者卷的入口。在設置了卷的掛載點後,用戶或者應用程序可以使用卷標或者指定的掛載點進入卷。
1.關鍵API
(1)FindFirstVolumeMountPoint
功能:獲取指定卷的第一個掛載點
函數原型:
HANDLE FindFirstVolumeMountPoint(
LPTSTR lpszRootPathName,
LPTSTR lpszVolumeMountPoint,
DWORD cchBufferLength
);
參數:
lpszRootPathName,輸入參數,指定要查找的卷名,必須以反斜槓結尾
lpszVolumeMountPoint,輸出參數,找到的第一個掛載點
cchBufferLength,輸出參數,用來存儲輸出掛載點的緩存大小
返回值:
返回HANDLE值,為一個查找句柄,FindNextVolumeMountPoint用該句柄查找下一個掛載點。錯誤時值為INVALID_HANDLE_VALUE,並且可以使用GetLastError()函數獲取詳細的錯誤信息。
(2)FindNextVolumeMountPoint
功能:查找指定卷的後繼掛載點
函數原型:
BOOL FindNextVolumeMountPoint(
HANDLE hFindVolumeMountPoint,
LPTSTR lpszVolumeMountPoint,
DWORD cchBufferLength
);
參數:
hFindVolumeMountPoint:輸入參數,查找句柄,由hFindFirstVolumeMountPoint獲取。
lpszFindVolumeMountPoint:輸出參數,找到後繼掛在點。
cchBufferLength:輸入參數,用來存儲輸出掛載點的緩存大小。
返回值:
返回BOOL值,表示查找是否成功,失敗並且GetLastError函數返回ERROR_NO_MORE_FILES代碼時表示已經查找完所有的掛載點。
(3)FindVolumeMountPointClose
功能:關閉FindFirstVolumeMountPoint打開的卷句柄
函數原型:
BOOL FindVolumeMountPointClose(
HANDLE hFindVolumeMountPoint,
);
參數:
hFindVolumeMountPoint:要關閉的掛載點的查找句柄。
返回值:
返回BOOL值,是否成功關閉句柄。、
(4)GetVolumeNameForVolumeMountPoint
功能:查找指定卷的後繼掛載點
函數原型:
GetVolumeNameForVolumeMountPoint(
LPTSTR lpszVolumeMountPoint,
LPTSTR lpszVolumeName,
DWORD cchBufferLength
)
參數:
lpszVolumeMountPoint:輸入參數,指定需要查找掛載點或者根目錄,以反斜槓結束。
lpszFindVolumeName:輸出參數,掛載點對應的卷設備名,形式為"\\?\Volume{GUID}\"。
cchBufferLength:輸入參數,用來存儲輸出設備名的緩存大小。
返回值:
返回BOOL值,表示函數是否成功,同樣可以用GetLasterror()函數獲取更詳細的錯誤信息。