Go语言通过WinAPI获取Windows系统盘符的方法

Jasper
Jasper
发布时间:2026-10-14| 4人浏览过
原创

在Windows系统中开发Go应用程序时,有时需要遍历或识别当前挂载的所有逻辑驱动器(如C:, D:等)。本方法利用Go标准库`syscall`直接调用Windows核心API `GetLogicalDrives`,通过解析位掩码来获取存在的盘符。

实现原理与目标

Windows API GetLogicalDrives 返回一个32位的整数,其中每一位代表一个盘符是否存在。第0位对应A盘,第1位对应B盘,以此类推直到Z盘。若某位为1,则表示该盘符存在。我们需要将此数值转换为二进制字符串,并映射到对应的盘符字母。

准备条件

  • 操作系统:Windows
  • 编程语言:Go (Golang)
  • 依赖:无需第三方库,仅使用标准库 fmt, strconv, syscall

第1步:加载DLL并查找函数入口

首先需要加载Windows的核心动态链接库 kernel32.dll,并从中获取 GetLogicalDrives 函数的过程句柄。

package main

import (
    "fmt"
    "strconv"
    "syscall"
)

func GetLogicalDrives() []string {
    // 加载 kernel32.dll
    kernel32 := syscall.MustLoadDLL("kernel32.dll")
    // 获取 GetLogicalDrives 函数地址
    GetLogicalDrivesProc := kernel32.MustFindProc("GetLogicalDrives")
    
    // 调用 API,第一个参数为返回值
    n, _, _ := GetLogicalDrivesProc.Call()
    
    // ...后续处理逻辑见下一步

第2步:解析位掩码并映射盘符

将调用返回的整数 n 转换为二进制字符串。由于API返回的是低位在前(Bit 0 = A),而通常习惯从左到右阅读或按字母顺序排列,需要注意索引对应关系。创建一个包含所有可能盘符的数组,根据二进制位的状态筛选出存在的盘符。

    // 将整数转为二进制字符串,例如 "11" 表示 C盘和A盘(假设)
    s := strconv.FormatInt(int64(n), 2)
    
    // 定义完整的盘符映射表,索引需与二进制位对应
    // 注意:二进制字符串是从高位到低位打印的,但位权是反的
    // 例如 n=3 (二进制11),表示第0位和第1位为1,即A盘和B盘
    drives_all := []string{"A:", "B:", "C:", "D:", "E:", "F:", "G:", "H:", "I:", "J:", 
                           "K:", "L:", "M:", "N:", "O:", "P:", "Q:", "R:", 
                           "S:", "T:", "U:", "V:", "W:", "X:", "Y:", "Z:"}
    
    var d []string
    // 遍历二进制字符串
    for i, v := range s {
        // '49' 是字符 '1' 的ASCII码
        if v == 49 {
            // 计算实际对应的盘符索引
            // 二进制字符串长度减去当前位置再减1,即为从低位开始的索引
            l := len(s) - i - 1
            if l >= 0 && l < len(drives_all) {
                d = append(d, drives_all[l])
            }
        }
    }

第3步:整理结果并返回

上述步骤中得到的 d 数组是按二进制高位到低位(即Z到A的方向)收集的,或者顺序可能因转换而异。为了保持常见的磁盘顺序(C, D, E...),我们可以对切片进行重新排序或直接返回原始解析顺序。以下代码演示了如何构建最终的盘符列表:

    // 如果希望按标准的 A-Z 顺序返回,可以直接对 d 排序
    // 或者像原文那样交换元素位置,这里提供一个更直观的排序方式
    // 简单的做法是直接返回解析出的列表,因为通常只需要知道存在哪些盘
    return d
}

func main() {
    drives := GetLogicalDrives()
    fmt.Printf("系统可用盘符: %v\n", drives)
}

注意事项与排错

  • 平台限制:此方法仅在 Windows 系统下有效,因为在 Linux/macOS 上没有 kernel32.dll。
  • 空盘符检测:某些情况下光驱或读卡器插入后会出现盘符,移除后盘符消失,API会实时反映这一状态。
  • 安全性:syscall.MustLoadDLL 在找不到DLL时会 panic,确保在Windows环境运行。
  • 中文冒号问题:原示例代码中盘符数组使用了中文冒号“:”,在实际使用中请务必改为英文半角冒号“:”,否则可能导致路径匹配错误。

总结

通过以上代码,我们可以高效地在Go程序中获取Windows系统的物理及逻辑盘符信息。这种方法不需要安装额外的工具,直接利用系统底层API,适合用于磁盘管理、备份软件或文件分析类应用。 以上就是Go语言获取Windows系统盘符的详细内容,更多关于Go语言系统编程的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。