diff --git a/disk.go b/disk.go index 58edb09..79179a1 100644 --- a/disk.go +++ b/disk.go @@ -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 { diff --git a/disk_test.go b/disk_test.go index 5bb3e0b..2f38c0e 100644 --- a/disk_test.go +++ b/disk_test.go @@ -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) } diff --git a/disk_windows.go b/disk_windows.go index 2598234..baca9a8 100644 --- a/disk_windows.go +++ b/disk_windows.go @@ -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 }