我查看了 golang.org/pkg/os/#File,但仍然不清楚。 似乎没有办法获取文件长度,我错过了什么吗?
如何在Go中获取文件长度?
(*os.File).Stat()
会返回一个 os.FileInfo
值,它有一个 Size()
方法。所以,假设有一个文件 f
,那么代码就可以这样写:
f.Stat().Size()
fi, err := f.Stat()
if err != nil {
// Could not obtain stat, handle error
}
fmt.Printf("The file is %d bytes long", fi.Size())
os.Stat
。fi, err := os.Stat("/path/to/file")
if err != nil {
return err
}
// get the size
size := fi.Size()
file, err := os.Open( filepath )
if err != nil {
log.Fatal(err)
}
fi, err := file.Stat()
if err != nil {
log.Fatal(err)
}
fmt.Println( fi.Size() )
按照@shebaw所说,在UNIX操作系统中调用os.Stat更有效率,因为stat()是一种Unix系统调用,返回关于一个inode的文件属性
,而不必打开文件处理。
注意: 使用其他方法可能会导致多线程/并发应用程序中出现太多打开的文件
问题,因为您需要打开文件来查询统计信息
这里是基准测试结果
func GetFileSize1(filepath string) (int64, error) {
fi, err := os.Stat(filepath)
if err != nil {
return 0, err
}
// get the size
return fi.Size(), nil
}
func GetFileSize2(filepath string) (int64, error) {
f, err := os.Open(filepath)
if err != nil {
return 0, err
}
defer f.Close()
fi, err := f.Stat()
if err != nil {
return 0, err
}
return fi.Size(), nil
}
BenchmarkGetFileSize1-8 704618 1662 ns/op
BenchmarkGetFileSize2-8 199461 5668 ns/op
Stat()
之前加上defer file.Close()
可能会更好吧? - Timmmmfi
io.Reader 没有被传递到其他地方,因此关闭它可能是妄自尊大的。 - colm.anseo