gpt4 book ai didi

windows - 获取固定驱动器列表

转载 作者:行者123 更新时间:2023-12-01 21:09:45 32 4
gpt4 key购买 nike

我如何仅获取物理驱动器的所有安装点列表?我看到这里有一个类似的答案,但这列出了所有安装点,包括网络共享。
How can I get a listing of all drives on Windows using golang?

最佳答案

好的,我已经决定放弃我的Win32 API编程技能并准备一个解决方案。
基于the thread you referred to的the脚方法的解决方案如下:

package main

import (
"errors"
"fmt"
"log"
"syscall"
"unsafe"
)

var (
kernel32 = syscall.NewLazyDLL("kernel32.dll")

getDriveTypeWProc = kernel32.NewProc("GetDriveTypeW")
)

func getDriveType(rootPathName []uint16) (int, error) {
rc, _, _ := getDriveTypeWProc.Call(
uintptr(unsafe.Pointer(&rootPathName[0])),
)

dt := int(rc)

if dt == driveUnknown || dt == driveNoRootDir {
return -1, driveTypeErrors[dt]
}

return dt, nil
}

var (
errUnknownDriveType = errors.New("unknown drive type")
errNoRootDir = errors.New("invalid root drive path")

driveTypeErrors = [...]error{
0: errUnknownDriveType,
1: errNoRootDir,
}
)

const (
driveUnknown = iota
driveNoRootDir

driveRemovable
driveFixed
driveRemote
driveCDROM
driveRamdisk
)

func getFixedDOSDrives() ([]string, error) {
var drive = [4]uint16{
1: ':',
2: '\\',
}

var drives []string

for c := 'A'; c <= 'Z'; c++ {
drive[0] = uint16(c)
dt, err := getDriveType(drive[:])

if err != nil {
if err == errNoRootDir {
continue
}
return nil, fmt.Errorf("error getting type of: %s: %s",
syscall.UTF16ToString(drive[:]), err)
}

if dt != driveFixed {
continue
}

drives = append(drives, syscall.UTF16ToString(drive[:]))
}

return drives, nil
}

func main() {
drives, err := getFixedDOSDrives()
if err != nil {
log.Fatal(err)
}
for _, drive := range drives {
log.Println(drive)
}
}
按框运行(在Wine 4.0下),我得到:
tmp$ GOOS=windows go build drvs.go 
tmp$ wine64 ./drvs.exe
0009:fixme:process:SetProcessPriorityBoost (0xffffffffffffffff,1): stub
2020/07/06 21:06:02 C:\
2020/07/06 21:06:02 D:\
2020/07/06 21:06:02 X:\
2020/07/06 21:06:02 Z:\
(所有驱动器都使用 winecfg映射。)

这种方法的问题是:
  • 即使系统中存在的DOS驱动器的数量比ASCII大写字母的数量小得多,它也会执行26个系统调用。
  • 在当今的Windows系统上,驱动器可能会映射到常规目录下-非常类似于POSIX系统上的驱动器,因此它根本没有DOS驱动器号。
    孙承旭(Eryk Sun)精确地暗示了对此应该采取的措施。
    我将尝试返回一个适当的(尽管更为复杂的)解决方案,其中考虑了这些因素。

  • 这是带有代码的 gist
    GetDriveTypeW docs
    希望这会使您对Win32 API的工作方式以及Go中的工作方式感兴趣。尝试查看Go安装中的 syscall包的源-连同MSDN文档,这应该可以发现。

    关于windows - 获取固定驱动器列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62731962/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com