Golang 计算目录的大小

在日常开发和运维中,经常会遇到需要计算某个目录下所有文件大小的情况,本文将通过使用Golang语言编写一个程序来计算给定目录的大小。
1. 获取文件大小
首先,我们需要编写一个函数来获取文件的大小。这里我们使用os包来操作文件系统,具体的代码如下:
package main
import (
"fmt"
"os"
)
func getFileSize(path string) (int64, error) {
file, err := os.Open(path)
if err != nil {
return 0, err
}
defer file.Close()
fileInfo, err := file.Stat()
if err != nil {
return 0, err
}
return fileInfo.Size(), nil
}
func main() {
path := "test.txt"
size, err := getFileSize(path)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Printf("File size of %s: %d bytes\n", path, size)
}
}
运行上述代码,可以得到输出:
File size of test.txt: 1024 bytes
2. 遍历目录
接下来,我们需要编写一个递归函数来遍历指定目录下的所有文件和子目录,并计算它们的总大小。代码如下所示:
package main
import (
"fmt"
"os"
"path/filepath"
)
func calculateDirectorySize(path string) (int64, error) {
var totalSize int64
err := filepath.Walk(path, func(filePath string, fileInfo os.FileInfo, err error) error {
if err != nil {
return err
}
if !fileInfo.IsDir() {
size, err := getFileSize(filePath)
if err != nil {
return err
}
totalSize += size
}
return nil
})
if err != nil {
return 0, err
}
return totalSize, nil
}
func main() {
path := "/path/to/directory"
size, err := calculateDirectorySize(path)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Printf("Total size of %s: %d bytes\n", path, size)
}
}
在上述代码中,filepath.Walk函数会递归地遍历指定目录下的所有文件和子目录,然后调用getFileSize函数来获取文件的大小,并将其累加到totalSize变量中。
3. 完整代码
下面是完整的计算目录大小的Golang程序:
package main
import (
"fmt"
"os"
"path/filepath"
)
func getFileSize(path string) (int64, error) {
file, err := os.Open(path)
if err != nil {
return 0, err
}
defer file.Close()
fileInfo, err := file.Stat()
if err != nil {
return 0, err
}
return fileInfo.Size(), nil
}
func calculateDirectorySize(path string) (int64, error) {
var totalSize int64
err := filepath.Walk(path, func(filePath string, fileInfo os.FileInfo, err error) error {
if err != nil {
return err
}
if !fileInfo.IsDir() {
size, err := getFileSize(filePath)
if err != nil {
return err
}
totalSize += size
}
return nil
})
if err != nil {
return 0, err
}
return totalSize, nil
}
func main() {
path := "/path/to/directory"
size, err := calculateDirectorySize(path)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Printf("Total size of %s: %d bytes\n", path, size)
}
}
4. 总结
通过本文的介绍,我们学习了如何使用Golang编写一个程序来计算给定目录的大小。首先,我们要获取文件的大小,然后使用递归函数遍历指定目录下的所有文件和子目录,并计算它们的总大小。这个程序可以帮助我们快速地获取目录的大小信息,方便进行日常开发和运维工作。
极客笔记