曲径通幽论坛

标题: FindFirstVolume()/FindNextVolume()/FindVolumeClose() [打印本页]

作者: beyes    时间: 2012-2-13 14:44
标题: FindFirstVolume()/FindNextVolume()/FindVolumeClose()
FindFirstVolume() 函数原型如下:
HANDLE WINAPI FindFirstVolume(
  __out  LPTSTR lpszVolumeName,
  __in   DWORD cchBufferLength
);
该函数用来查找主机中的第一个驱动器,并返回驱动器设备名,该名字存储在第 1 个参数 lpszVolumeName 表示的缓冲区中,第 2 个参数 cchBufferLength 指定了第 1 个参数所表示缓冲区的大小。返回的设备名的形式如:
\\?\Volume{GUID}
函数的返回值是卷搜索句柄,可作为 FindNextVolume() 函数的参数,以继续查找下一个驱动器的设备名,FindNextVolume() 函数原型如下:
BOOL WINAPI FindNextVolume(
  __in   HANDLE hFindVolume,
  __out  LPTSTR lpszVolumeName,
  __in   DWORD cchBufferLength
);
该函数的第 1 个参数 hFindVolume 设置为 FindFirstVolume() 所返回的卷搜索句柄。
第 2 个参数是用来保存驱动器名的缓冲区。
第 3 个参数是缓冲区的大小。
函数执行成功返回非零值,失败则返回零值,也表示查找完所有的逻辑驱动器。

FindVolumeClose() 函数原型如下:
BOOL WINAPI FindVolumeClose(
  __in  HANDLE hFindVolume
);
该函数关闭 FindFirstVolume() 所打开的卷遍历句柄。

测试代码:
[C++] 纯文本查看 复制代码
#include "stdafx.h"

#define BUFSIZE    1024

int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR    buf[BUFSIZE];
    HANDLE    hVol;
    BOOL    bFlag;
   
    ZeroMemory(buf, BUFSIZE);

    hVol = FindFirstVolume(buf, BUFSIZE);

    if (hVol == INVALID_HANDLE_VALUE) {
        printf ("No volumes found!\n");
        return (-1);
    }
    _tprintf (TEXT("%s\n"), buf);

    while (FindNextVolume(hVol, buf, BUFSIZE)) {
        _tprintf (TEXT("%s\n"), buf);
    }

    bFlag = FindVolumeClose(hVol);

    return (bFlag);
}

运行输出:
\\?\Volume{2736ce5f-3f2b-11e1-a584-806e6f6e6963}\
\\?\Volume{2736ce5e-3f2b-11e1-a584-806e6f6e6963}\
\\?\Volume{2736ce60-3f2b-11e1-a584-806e6f6e6963}\
\\?\Volume{8c40b2e2-3f3b-11e1-8ccb-6cf049ee76dc}\
\\?\Volume{2736ce63-3f2b-11e1-a584-806e6f6e6963}\

什么是“卷”?
卷,又称为“逻辑驱动器”,是 NTFS, FAT32 等文件系统组织结构的最高层。卷是存储设备(如硬盘)上由文件系统管理的一块区域,是在逻辑上相互隔离的存储单元。一个磁盘分区至少包含一个卷,当然卷也可以存在于多个磁盘分区上,仅存在于一个分区上的卷称为“简单卷“,存在于多个磁盘分区上的卷称为”多分区卷“或”跨区卷“。最为常见的情况是一个分区只包含 一个卷,一个卷只存在于一个分区上,所以往往会造成的混淆是卷等于分区。卷存在卷标,程序可以通过卷标访问卷。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2