4
votes

Comment obtenir la taille totale d'un lecteur sous Windows

Je souhaite obtenir la taille totale d'un lecteur dans Go sous Windows à l'aide de l'appel API Windows standard;

J'ai trouvé ceci pour obtenir de l'espace libre.

Maintenant, je veux la taille totale de l'espace du lecteur spécial par exemple

C: \


0 commentaires

3 Réponses :


4
votes

Votre question + réponse associée montre comment obtenir de l'espace libre. La solution utilise GetDiskFreeSpaceExW () Windows API à partir de kernel32.dll pour l’obtenir.

La même fonction peut également être utilisée pour obtenir la taille totale. Signature de la fonction GetDiskFreeSpaceExW () :

1 0 Success.
Free: 16795295744 Total: 145545281536 Available: 16795295744

Il a un en-paramètre, le chemin, et il a 3 paramètres de sortie, à savoir le octets libres (disponibles pour l'appelant), le nombre total d'octets (taille du disque) et le total d'octets libres.

Donc, simplement lorsque vous l'appelez, fournissez des variables (pointeurs) pour toutes les informations que vous voulez en tirer .

Par exemple:

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)

L'exécution, un exemple de sortie:

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


0 commentaires


1
votes

Les autres réponses sont obsolètes car syscall est obsolète.

Vous devez utiliser golang.org/x/sys/windows maintenant (en adaptant la réponse icza):

import (
    "fmt"
    "golang.org/x/sys/windows"

)

// print disk usage of path/disk
func DiskUsage(path string) bool {

    var free, total, avail uint64

    path = "c:\\"
    pathPtr, err := windows.UTF16PtrFromString(path)
    if err != nil{
        panic(err)
    }
    err = windows.GetDiskFreeSpaceEx(pathPtr, &free, &total, &avail)


    fmt.Println("Free:", free, "Total:", total, "Available:", avail)
}


0 commentaires