基于visual c++之windows核心编程代码分析(23)遍历驱动器并获取驱动器属性

我们在进行Windows编程的时候,经常需要进行遍历驱动器并获取驱动器属性,我们来实现遍历驱动器并获取驱动器属性。请见代码实现与注释讲解

 

#define _WIN32_WINNT 0x0501
/* 头文件 */
#include <windows.h>
#include <stdio.h>
/* 预定义 */
#define BUFSIZE            MAX_PATH
/* 函数申明 */
BOOL GetDirverInfo(LPSTR szDrive);

/* ************************************
* 功能	应用程序主函数,遍历驱动器并调用
*		GetDirverInfo 获取驱动器属性
**************************************/
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);
}

/* ************************************
 * BOOL GetDirverInfo(LPSTR szDrive)
 * 功能	获取驱动器的属性
 * 参数	LPSTR szDrive
 * 	指明要获取属性的驱动器的根路径 如 C:\
 * 返回值 BOOL 是否成功
 **************************************/
BOOL GetDirverInfo(LPSTR szDrive)
{
	UINT uDriveType;
	DWORD dwVolumeSerialNumber;
	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 removable 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,
		&dwVolumeSerialNumber,
		&dwMaximumComponentLength,
		&dwFileSystemFlags,
		szFileSystemNameBuffer,
		BUFSIZE
		))
	{
		return FALSE;
	}
	if(0!=lstrlen(szDirveName))
	{
		printf ("\nDrive Name is %s\n",szDirveName);
	}

	printf ("\nVolume Serial Number is %u",dwVolumeSerialNumber);
	printf ("\nMaximum 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 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 supports case-sensitive file names.\n");
	}
	//you can use these value to get more informaion
	//
	//FILE_CASE_PRESERVED_NAMES
	//FILE_CASE_SENSITIVE_SEARCH
	//FILE_FILE_COMPRESSION
	//FILE_NAMED_STREAMS
	//FILE_PERSISTENT_ACLS
	//FILE_READ_ONLY_VOLUME
	//FILE_SUPPORTS_ENCRYPTION
	//FILE_SUPPORTS_OBJECT_IDS
	//FILE_SUPPORTS_REPARSE_POINTS
	//FILE_SUPPORTS_SPARSE_FILES
	//FILE_UNICODE_ON_DISK
	//FILE_VOLUME_IS_COMPRESSED
	//FILE_VOLUME_QUOTAS
	printf("...\n");
	return TRUE;
}


 

你可能感兴趣的:(基于visual c++之windows核心编程代码分析(23)遍历驱动器并获取驱动器属性)