Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| // Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan. | |
| // License: https://creativecommons.org/licenses/by-nc-sa/4.0/ | |
| // See page 247. | |
| //!+main | |
| // The du1 command computes the disk usage of the files in a directory. | |
| package main | |
| import ( | |
| "flag" | |
| "fmt" | |
| "io/ioutil" | |
| "os" | |
| "path/filepath" | |
| ) | |
| func main() { | |
| // Determine the initial directories. | |
| flag.Parse() | |
| roots := flag.Args() | |
| if len(roots) == 0 { | |
| roots = []string{"."} | |
| } | |
| // Traverse the file tree. | |
| fileSizes := make(chan int64) | |
| go func() { | |
| for _, root := range roots { | |
| walkDir(root, fileSizes) | |
| } | |
| close(fileSizes) | |
| }() | |
| // Print the results. | |
| var nfiles, nbytes int64 | |
| for size := range fileSizes { | |
| nfiles++ | |
| nbytes += size | |
| } | |
| printDiskUsage(nfiles, nbytes) | |
| } | |
| func printDiskUsage(nfiles, nbytes int64) { | |
| fmt.Printf("%d files %.1f GB\n", nfiles, float64(nbytes)/1e9) | |
| } | |
| //!-main | |
| //!+walkDir | |
| // walkDir recursively walks the file tree rooted at dir | |
| // and sends the size of each found file on fileSizes. | |
| func walkDir(dir string, fileSizes chan<- int64) { | |
| for _, entry := range dirents(dir) { | |
| if entry.IsDir() { | |
| subdir := filepath.Join(dir, entry.Name()) | |
| walkDir(subdir, fileSizes) | |
| } else { | |
| fileSizes <- entry.Size() | |
| } | |
| } | |
| } | |
| // dirents returns the entries of directory dir. | |
| func dirents(dir string) []os.FileInfo { | |
| entries, err := ioutil.ReadDir(dir) | |
| if err != nil { | |
| fmt.Fprintf(os.Stderr, "du1: %v\n", err) | |
| return nil | |
| } | |
| return entries | |
| } | |
| //!-walkDir | |
| // The du1 variant uses two goroutines and | |
| // prints the total after every file is found. |