Skip to content

Instantly share code, notes, and snippets.

@lunny
Created March 28, 2014 08:59
Show Gist options
  • Save lunny/9828326 to your computer and use it in GitHub Desktop.
Save lunny/9828326 to your computer and use it in GitHub Desktop.
Disk Info for Golang
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))
}
@edisonrf
Copy link

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

@davinchia
Copy link

Fyi. The syscall package has been deprecated.

@josephpaul0
Copy link

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.

@cenkalti
Copy link

As @edisonrf has pointed out, Bavail is more meaningful in most contexts.

@acls
Copy link

acls commented Apr 10, 2019

@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.

@ttys3
Copy link

ttys3 commented Sep 28, 2019

@nicolebeaumont
Copy link

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),
	}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment