问题
Basically I want the output of df -h
, which includes both the free space and the total size of the volume. The solution needs to work on Windows, Linux, and Mac and be written in Go.
I have looked through the os
and syscall
Go documentation and haven't found anything. On Windows, even command line utils are either awkward (dir C:\
) or need elevated privileges (fsutil volume diskfree C:\
). Surely there is a way to do this that I haven't found yet...
UPDATE:
Per nemo's answer and invitation, I have provided a cross-platform Go package that does this.
回答1:
On POSIX systems you can use syscall.Statfs.
Example of printing free space in bytes of current working directory:
import "syscall"
import "os"
var stat syscall.Statfs_t
wd, err := os.Getwd()
syscall.Statfs(wd, &stat)
// Available blocks * size per block = available space in bytes
fmt.Println(stat.Bavail * uint64(stat.Bsize))
For Windows you need to go the syscall route as well. Example (source):
h := syscall.MustLoadDLL("kernel32.dll")
c := h.MustFindProc("GetDiskFreeSpaceExW")
var freeBytes int64
_, _, err := c.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(wd))),
uintptr(unsafe.Pointer(&freeBytes)), nil, nil)
Feel free to write a package that provides the functionality cross-platform. On how to implement something cross-platform, see the build tool help page.
来源:https://stackoverflow.com/questions/20108520/get-amount-of-free-disk-space-using-go