我查了 golang.org/pkg/os/#File,但还是不知道。似乎无法获取文件长度,我错过了什么吗?
如何在Go中获取文件长度?
我查了 golang.org/pkg/os/#File,但还是不知道。似乎无法获取文件长度,我错过了什么吗?
如何在Go中获取文件长度?
Answers:
(*os.File).Stat()
返回一个os.FileInfo
值,该值又具有一个Size()
方法。因此,给定一个文件f
,代码将类似于
fi, err := f.Stat()
if err != nil {
// Could not obtain stat, handle error
}
fmt.Printf("The file is %d bytes long", 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() )
fi
io.Reader没有在其他地方传递,因此关闭它可能是自以为是的。
如@shebaw所述(至少在UNIX OS中),调用os.Stat效率更高,原因是stat() is a Unix system call that returns file attributes about an inode
,并且不需要处理打开文件。
注意:由于您打开文件以查询统计信息,因此使用其他方法可能会导致 too many open files
多线程/并发应用程序
这里是基准
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
defer file.Close()
之前的Stat()
?