Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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

This comment has been minimized.

Copy link

@edisonrf edisonrf commented Nov 10, 2016

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

This comment has been minimized.

Copy link

@davinchia davinchia commented Aug 24, 2018

Fyi. The syscall package has been deprecated.

@josephpaul0

This comment has been minimized.

Copy link

@josephpaul0 josephpaul0 commented Feb 4, 2019

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

This comment has been minimized.

Copy link

@cenkalti cenkalti commented Feb 19, 2019

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

@acls

This comment has been minimized.

Copy link

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

This comment has been minimized.

Copy link

@ttys3 ttys3 commented Sep 28, 2019

@nicolebeaumont

This comment has been minimized.

Copy link

@nicolebeaumont nicolebeaumont commented Aug 5, 2020

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