Как на golang просмотреть список дисков и флешек, подключенных к компьютеру?

Пользователь

от domenick , в категории: Общие вопросы , 7 месяцев назад

Как на golang просмотреть список дисков и флешек, подключенных к компьютеру?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

2 ответа

Пользователь

от dena , 7 месяцев назад

@domenick 

Для просмотра списка дисков и флешек, подключенных к компьютеру, можно воспользоваться пакетом os и его функцией ReadDir.


Ниже приведен пример кода, который позволяет получить список всех доступных дисков и флешек:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
	"fmt"
	"log"
	"os"
)

func main() {
	devices, err := os.ReadDir("/dev")
	if err != nil {
		log.Fatal(err)
	}

	for _, device := range devices {
		// Игнорируем неинтересующие нас файлы
		if device.IsDir() || device.Name() == "stdin" || device.Name() == "stdout" || device.Name() == "stderr" {
			continue
		}

		fmt.Println(device.Name())
	}
}


Примерный вывод программы может выглядеть так:

1
2
3
4
5
6
7
8
sda
sda1
sda2
sdb
sdb1
sdc
sdc1
...


Обратите внимание, что этот код работает на Linux-подобных ОС. Если вам нужно получить список дисков на других операционных системах, то может потребоваться другой подход.

Пользователь

от janiya , 7 месяцев назад

@domenick 

Этот код применим для Linux-подобных операционных систем, на которых диски и флешки обычно представлены как файлы в директории "/dev".


Однако, для других операционных систем, таких как Windows или macOS, требуется использовать специфичные инструменты или API для получения списка дисков и флешек.


На Windows, можно использовать пакет github.com/AllenDang/w32, который предоставляет доступ к функциям WinAPI, в том числе, для получения списка всех дисков. Вот пример кода для просмотра дисков на Windows:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
	"fmt"
	"unsafe"

	"github.com/AllenDang/w32"
)

func main() {
	driveBits := w32.GetLogicalDrives()
	for i := uint32(0); i < 26; i++ {
		if driveBits&(1<<i) != 0 {
			drive := string('A' + i) + ":\"
			volumeName := make([]uint16, w32.MAX_PATH)
			fileSystemName := make([]uint16, w32.MAX_PATH)
			w32.GetVolumeInformation(w32.StringToTCHAR(drive), &volumeName[0], uint32(len(volumeName)), nil, nil, nil, &fileSystemName[0], uint32(len(fileSystemName)))
			fmt.Println("Drive:", drive)
			fmt.Println("Volume Name:", w32.UTF16PtrToString(&volumeName[0]))
			fmt.Println("File System Name:", w32.UTF16PtrToString(&fileSystemName[0]))
			fmt.Println()
		}
	}
}


Пример вернет список всех доступных дисков, их имена и файловую систему.


На macOS, можно использовать пакет github.com/mitchellh/go-psutil, который также позволяет получить информацию о дисках. Вот пример кода для просмотра дисков на macOS:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
	"fmt"
	"log"

	"github.com/mitchellh/go-psutil/disk"
)

func main() {
	partitions, err := disk.Partitions(true)
	if err != nil {
		log.Fatal(err)
	}

	for _, partition := range partitions {
		fmt.Println("Device:", partition.Device)
		fmt.Println("Mount Point:", partition.Mountpoint)
		fmt.Println("File System Type:", partition.Fstype)
		fmt.Println()
	}
}


Этот пример вернет список всех доступных дисков, их разделы, точки монтирования и тип файловой системы.