windows API 第 18篇 FindFirstVolume FindNextVolume

函数定义:
Retrieves the name of a volume on a computer. FindFirstVolume is used to begin scanning the volumes of a computer.

HANDLE WINAPI FindFirstVolume(
                               _Out_ LPTSTR lpszVolumeName,
                               _In_  DWORD  cchBufferLength
                              );
说明:
检索本机卷的名字,但这个名字是GUID(全局唯一标志符)路径的,可见卷的表示方法有好多种,不仅仅是我们平时所看到的C盘,D盘,
返回值:
成功返回一个有效的句柄,最后需要用FindVolumeClose函数关掉该句柄。失败返回INVALID_HANDLE_VALUE。

接着又一个函数:
BOOL WINAPI FindNextVolume( _In_  HANDLE hFindVolume, _Out_ LPTSTR lpszVolumeName, _In_  DWORD  cchBufferLength );
说明:
第一个参数就是用调用FindFirstVolume的返回句柄, 其它两个参数不多介绍了,

用这两个函数循环的遍历所有的可用卷。

下面写一个例子来输出这个GUID名称:
void main()

{

CHAR szVolume[MAX_PATH] = { 0 };

HANDLE hVolume = FindFirstVolumeA(szVolume,MAX_PATH);
if (INVALID_HANDLE_VALUE == hVolume)
return 0;
//string strVolume = szVolume;
printf("%s 
", szVolume);
while (FindNextVolumeA(hVolume, szVolume, MAX_PATH))
{
printf("%s 
", szVolume);
}


FindVolumeClose(hVolume);//别忘了关闭句柄

}

 我的输出结果是这样的:

windows API 第 18篇 FindFirstVolume    FindNextVolume - Prairie - work labor and play

分析:

可见这些也代表着卷标的唯一标志,我的笔记本上是有五个驱动器,分别是C盘,D盘,E盘,F盘和CD ROM光驱H。这样也证实了这一说法。

接下来我们用GetDriveType函数拿上面的返回值测试一下看正确不。

The GetDriveType function determines whether a disk drive is a removable, fixed, CD-ROM, RAM disk, or

network drive. //判断卷的类型

UINT GetDriveType(

LPCTSTR lpRootPathName // root directory

);

void main()

{

    UINT uGUIDType[5];
    UINT uNameType[5];
    int i = 0;

    CHAR szVolume[MAX_PATH] = { 0 };
    HANDLE hVolume = FindFirstVolumeA(szVolume,MAX_PATH);
    if (INVALID_HANDLE_VALUE == hVolume)
	return 0;

    //string strVolume = szVolume;
    //printf("%s 
", szVolume);
    uGUIDType[i] = GetDriveTypeA(szVolume);
    uNameType[i] = GetDriveTypeA("C:\");
    i++;
    while (FindNextVolumeA(hVolume, szVolume, MAX_PATH))
    {
	//printf("%s 
", szVolume);
	uGUIDType[i] = GetDriveTypeA(szVolume);
	i++;
    }
    uNameType[1] = GetDriveTypeA("D:\");
    uNameType[2] = GetDriveTypeA("E:\");
    uNameType[3] = GetDriveTypeA("F:\");
    uNameType[4] = GetDriveTypeA("H:\");

    CHAR szResult[MAX_PATH] = { 0 };
    sprintf_s(szResult, "uGUIDType:	%d  %d  %d  %d  %d  
uNameType:	%d  %d  %d  %d  %d
", uGUIDType[0], uGUIDType[1], uGUIDType[2], uGUIDType[3], uGUIDType[4], uNameType[0], uNameType[1], uNameType[2], uNameType[3], uNameType[4]);
    printf("%s", szResult);

}

这次查看结果:

windows API 第 18篇 FindFirstVolume    FindNextVolume - Prairie - work labor and play

可知那些奇怪的字符 \?Volume{fe04a021-a8fc-11e4-824b-806e6f6e6963}和"C:\"是一样的。

而这些数字代表什么呢?查看MSDN可得:

#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

原文地址:https://www.cnblogs.com/priarieNew/p/9755394.html