package utils import ( "io/ioutil" "strconv" "strings" "github.com/pkg/errors" ) var sizeSuffixes = [...]string{"B", "KiB", "MiB", "GiB", "TiB"} // ConvertFileSize converts size in bytes down to biggest units it represents. // Returns converted size, unit and, a concatenation of size and unit func ConvertFileSize(size int64) (float64, string, string) { idx := 0 fSize := float64(size) for ; fSize >= 1024; fSize /= 1024 { idx++ } fSizeStr := strconv.FormatFloat(fSize, 'f', 3, 64) fSizeStr = strings.TrimRight(fSizeStr, "0") fSizeStr = strings.TrimSuffix(fSizeStr, ".") return fSize, sizeSuffixes[idx], strings.Join([]string{fSizeStr, sizeSuffixes[idx]}, " ") } func DirectorySize(path string) (dirSz int64, err error) { dir, err := ioutil.ReadDir(path) if err != nil { return 0, errors.Wrapf(err, "failed to compute %s directory size", path) } for _, entry := range dir { dirSz += entry.Size() } // Here we subtract a size of a directory's inode to get size of files only. return dirSz - 4096, nil }