-
-
Save lunny/9828326 to your computer and use it in GitHub Desktop.
package main | |
import ( | |
"fmt" | |
"syscall" | |
) | |
type DiskStatus struct { | |
All uint64 `json:"all"` | |
Used uint64 `json:"used"` | |
Free uint64 `json:"free"` | |
} | |
// disk usage of path/disk | |
func DiskUsage(path string) (disk DiskStatus) { | |
fs := syscall.Statfs_t{} | |
err := syscall.Statfs(path, &fs) | |
if err != nil { | |
return | |
} | |
disk.All = fs.Blocks * uint64(fs.Bsize) | |
disk.Free = fs.Bfree * uint64(fs.Bsize) | |
disk.Used = disk.All - disk.Free | |
return | |
} | |
const ( | |
B = 1 | |
KB = 1024 * B | |
MB = 1024 * KB | |
GB = 1024 * MB | |
) | |
func main() { | |
disk := DiskUsage("/") | |
fmt.Printf("All: %.2f GB\n", float64(disk.All)/float64(GB)) | |
fmt.Printf("Used: %.2f GB\n", float64(disk.Used)/float64(GB)) | |
fmt.Printf("Free: %.2f GB\n", float64(disk.Free)/float64(GB)) | |
} |
Fyi. The syscall package has been deprecated.
Fyi. The syscall package has been deprecated.
It seems that the syscall package is still necessary for accessing native OS functions for system programming. If you know about another way, please do share that information with us.
As @edisonrf has pointed out, Bavail
is more meaningful in most contexts.
@josephpaul0 The syscall package was replaced by golang.org/x/sys
Comment from syscall docs:
Deprecated: this package is locked down. Callers should use the corresponding package in the golang.org/x/sys repository instead. That is also where updates required by new systems or versions should be applied. See https://golang.org/s/go1.4-syscall for more information.
I've post an updated version:
https://gist.github.com/ttys3/21e2a1215cf1905ab19ddcec03927c75
For others:
func (d *diskService) GetDiskUtilization() *models.DiskUtilizationSummary {
var stat syscall.Statfs_t
wd, err := os.Getwd()
if err != nil {
panic(err)
}
syscall.Statfs(wd, &stat)
all := stat.Blocks * uint64(stat.Bsize)
free := stat.Bfree * uint64(stat.Bsize)
used := all - free
percentageUtilized := float64(used) / float64(all) * float64(100)
return &models.DiskUtilizationSummary{
PercentageUtilized: int8(percentageUtilized),
TotalDiskBytes: int64(all),
}
}
good post, for disk free space, I suggest to use fs.Bavail, because Bavail mean amount available to user, similar to linux df's available, which is more meaningful