implement disk usage on Windows

pull/4/head
WAKAYAMA Shirou 11 years ago
parent e29742b52f
commit 8235f42686

@ -3,12 +3,11 @@ package main
type Disk struct{}
type Disk_usage struct {
Path string `json:"path"`
Total uint64 `json:"total"`
Free uint64 `json:"free"`
Available uint64 `json:"available"`
Used uint64 `json:"used"`
Percent float64 `json:"percent"`
Path string `json:"path"`
Total uint64 `json:"total"`
Free uint64 `json:"free"`
Used uint64 `json:"used"`
UsedPercent float64 `json:"usedPercent"`
}
type Disk_IO_Counters struct {

@ -3,13 +3,18 @@ package main
import (
"encoding/json"
"fmt"
"runtime"
"testing"
)
func TestDisk_usage(t *testing.T) {
disk := NewDisk()
v, err := disk.Disk_usage("/")
path := "/"
if runtime.GOOS == "windows" {
path = "C:"
}
v, err := disk.Disk_usage(path)
if err != nil {
t.Errorf("error %v", err)
}

@ -2,9 +2,36 @@
package main
func (d Disk) Disk_usage(path string) (Disk_usage, error) {
import (
"syscall"
"unsafe"
)
var (
procGetDiskFreeSpaceExW = modkernel32.NewProc("GetDiskFreeSpaceExW")
//GetLogicalDriveStrings, _ = syscall.GetProcAddress(modkernel32, "GetLogicalDriveStringsW")
)
func (d Disk) Disk_usage(path string) (Disk_usage, error) {
ret := Disk_usage{}
ret.Path = path
lpFreeBytesAvailable := int64(0)
lpTotalNumberOfBytes := int64(0)
lpTotalNumberOfFreeBytes := int64(0)
diskret, _, _ := procGetDiskFreeSpaceExW.Call(
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(path))),
uintptr(unsafe.Pointer(&lpFreeBytesAvailable)),
uintptr(unsafe.Pointer(&lpTotalNumberOfBytes)),
uintptr(unsafe.Pointer(&lpTotalNumberOfFreeBytes)))
if diskret == 0 {
return ret, syscall.GetLastError()
}
ret.Total = uint64(lpTotalNumberOfBytes)
// ret.Free = uint64(lpFreeBytesAvailable) // python psutil does not use this
ret.Free = uint64(lpTotalNumberOfFreeBytes)
ret.Used = ret.Total - ret.Free
ret.UsedPercent = float64(ret.Used) / float64(ret.Total) * 100.0
return ret, nil
}

Loading…
Cancel
Save