Как работать с usb-носителями в Golang?

В общем, мне нужна функция, возвращающая массив с адресами всех подключённых к компьютеру флешек (типа, "E:\\") - как это сделать на Go? В первую очередь, интересует решение для Windows.
  • Вопрос задан
  • 3218 просмотров
Пригласить эксперта
Ответы на вопрос 1
Флешки-не флешки, но вот с логическими дисками кейс разбирался на StackOverflow, предложены были 2 решения:
1) Простое - попробовать получить файловый дескриптор для корневой директории логических дисков с каждой буквой от A к Z:
func getdrives() (r []string){
    for _, drive := range "ABCDEFGHIJKLMNOPQRSTUVWXYZ"{
        _, err := os.Open(string(drive)+":\\")
        if err == nil {
            r = append(r, string(drive))
        }
    }
    return
}

2) Правильный, но OS-зависимый вариант (впрочем, первый тоже ос-зависимый): вызвать функцию WinApi getLogicalDrives, котоорая возвращает битовую маску доступных логических дисков:
//переводит битмаску в буквы
func bitsToDrives(bitMap uint32) (drives []string) {
    availableDrives := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    for i := 0; i < 32; i++ {
        if bitMap&1 == 1 {
            drives = append(drives, availableDrives[bitMap&1])
        }
        bitMap >>= 1
    }
    return
}

func main() {
    kernel32, _ = syscall.LoadLibrary("kernel32.dll")
    getLogicalDrivesHandle, _ = syscall.GetProcAddress(kernel32, "GetLogicalDrives")
    if ret, _, callErr := syscall.Syscall(uintptr(getLogicalDrivesHandle), 0, 0, 0, 0); callErr != 0 {
        // handle error
    } else {
        bitsToDrives(uint32(ret))
    }
}

Источник.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы