Как получить общий размер диска в Windows - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу получить общий размер диска в Go на окнах с помощью стандартного вызова API Windows;

Я нашел это , чтобы получить свободное место.

СейчасЯ хочу указать общий размер специального диска, например

C: \

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

В документах для GetDiskFreeSpraceExW функция объявлена ​​как:

BOOL GetDiskFreeSpaceExW(
  LPCWSTR         lpDirectoryName,
  PULARGE_INTEGER lpFreeBytesAvailableToCaller,
  PULARGE_INTEGER lpTotalNumberOfBytes,
  PULARGE_INTEGER lpTotalNumberOfFreeBytes
);

Таким образом, вы получите общий размер и доступный размер за один вызов:

import "syscall"
import "os"

func main() {
    wd := os.Getwd()

    h := syscall.MustLoadDLL("kernel32.dll")
    c := h.MustFindProc("GetDiskFreeSpaceExW")

    var freeBytesAvailableToCaller int64
    var totalNumberOfBytes int64
    var totalNumberOfFreeBytes int64

    c.Call(
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(wd))),
        uintptr(unsafe.Pointer(&freeBytesAvailableToCaller)), 
        uintptr(unsafe.Pointer(&totalNumberOfBytes)), 
        uintptr(unsafe.Pointer(&totalNumberOfFreeBytes))
    )

    print(freeBytesAvailableToCaller, totalNumberOfBytes, totalNumberOfBytes)
}
0 голосов
/ 13 февраля 2019

Ваш связанный вопрос + ответ показывает, как получить свободное место.В решении используется функция Windows API GetDiskFreeSpaceExW() из kernel32.dll для ее получения.

Эту же функцию можно использовать и для получения общего размера.Подпись функции GetDiskFreeSpaceExW():

BOOL GetDiskFreeSpaceExW(
  LPCWSTR         lpDirectoryName,
  PULARGE_INTEGER lpFreeBytesAvailableToCaller,
  PULARGE_INTEGER lpTotalNumberOfBytes,
  PULARGE_INTEGER lpTotalNumberOfFreeBytes
);

У нее есть входной параметр, путь и 3 выходных параметра, а именно свободные байты (доступные для вызывающей стороны), общее количество байтов (диск)size) и общее количество свободных байтов.

Поэтому просто, когда вы вызываете его, укажите переменные (указатели) для всей информации, которую вы хотите получить из него.

Например:

kernelDLL := syscall.MustLoadDLL("kernel32.dll")
GetDiskFreeSpaceExW := kernelDLL.MustFindProc("GetDiskFreeSpaceExW")

var free, total, avail int64

path := "c:\\"
r1, r2, lastErr := GetDiskFreeSpaceExW.Call(
    uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(path))),
    uintptr(unsafe.Pointer(&free)),
    uintptr(unsafe.Pointer(&total)),
    uintptr(unsafe.Pointer(&avail)),
)

fmt.Println(r1, r2, lastErr)
fmt.Println("Free:", free, "Total:", total, "Available:", avail)

Запуск, пример вывода:

1 0 Success.
Free: 16795295744 Total: 145545281536 Available: 16795295744
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...