File 如何在Go中获得文件长度?

File 如何在Go中获得文件长度?,file,go,File,Go,我抬头看了看,但还是不知道。 似乎没有办法获得文件长度,我错过了什么吗 如何在Go中获取文件长度?(*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()) 稍微

我抬头看了看,但还是不知道。 似乎没有办法获得文件长度,我错过了什么吗

如何在Go中获取文件长度?

(*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() )

如果不想打开文件,可以直接调用
os.Stat

fi, err := os.Stat("/path/to/file")
if err != nil {
    return err
}
// get the size
size := fi.Size()

正如@shebaw所说的调用os.Stat(至少在UNIX操作系统中)更有效,因为
Stat()是一个UNIX系统调用,它返回关于inode的文件属性
,不需要处理打开文件的问题

注意:在多线程/并发应用程序中,使用其他方法可能会导致打开的文件过多,因为您打开文件是为了查询统计信息

这里是基准

func GetFileSize1(文件路径字符串)(int64,错误){
fi,err:=os.Stat(文件路径)
如果错误!=零{
返回0,错误
}
//知道尺寸了吗
返回fi.Size(),nil
}
func GetFileSize2(文件路径字符串)(int64,错误){
f、 错误:=os.Open(文件路径)
如果错误!=零{
返回0,错误
}
延迟f.关闭()
fi,err:=f.Stat()
如果错误!=零{
返回0,错误
}
返回fi.Size(),nil
}

可能是在
Stat()
?@timmm之前有一个
defer file.Close()
?@timmm是的-但是由于这是一个代码片段,我们不能假设
fi
io.Reader没有被传递到其他地方,所以关闭它可能是冒昧的。
BenchmarkGetFileSize1-8           704618              1662 ns/op
BenchmarkGetFileSize2-8           199461              5668 ns/op