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: \
3 Réponses :
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 );
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) }