使用Windows API遍历卷

53 阅读1分钟

首先查看下电脑上有哪些逻辑卷

image.png

使用Windows API获取逻辑卷

代码

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE 1024

int main() {
    WCHAR szLogicalDriveStrings[BUFSIZE];
    PWCHAR szDrive;
    // 字符串清零
    ZeroMemory(szLogicalDriveStrings, BUFSIZE);

    // 获得电脑上的逻辑卷, 结果存在szLogicalDriveStrings中
    // 保存格式为 C:\\0D:\\0E:\\0\0,所以使用wprintf打印的时候只会打印C:\,因为遇到\0就停止了

    GetLogicalDriveStrings(BUFSIZE - 1, szLogicalDriveStrings);


   // wprintf(L"%s\n", szLogicalDriveStrings); // 只会打印一个C:\

    szDrive = szLogicalDriveStrings;

    do {
        wprintf(L"%s\n", szDrive);
        szDrive += lstrlen(szDrive) + 1;
    } while (*szDrive != '\x00');  // 当等于最后的\0时候,循环结束

    return 0;
}

执行结果

image.png

第二种方法获取电脑上的逻辑卷

代码

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE 1024

int main() {
    WCHAR buf[BUFSIZE];
    HANDLE hVol;
    BOOL bFlag;

    // 找到第一个逻辑卷,返回一个句柄
    hVol = FindFirstVolume(buf, BUFSIZE);

    if (hVol == INVALID_HANDLE_VALUE) {
        // 如果句柄值非法
        wprintf(TEXT("no valid volume found!"));
        return -1;
    }

    wprintf(L"%s\n", buf);  // 打印结果为设备名  \\?\Volume{c45b047e-0000-0000-0000-100000000000}\

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

    // 关闭句柄
    bFlag = FindVolumeClose(hVol);

    return bFlag;
}

运行结果

image.png