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

har*_*ass 62 file go

了一下 golang.org/pkg/os/#File,但仍然不知道.似乎没有办法获得文件长度,我错过了什么?

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

Dom*_*nef 98

(*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())
Run Code Online (Sandbox Code Playgroud)


she*_*baw 49

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

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


小智 13

稍微冗长的回答:

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() )
Run Code Online (Sandbox Code Playgroud)

  • 也许在`Stat()`之前``defer file.Close()`? (6认同)
  • @Timmmm 是的 - 但由于这是一个代码片段,我们不能假设 `fi` io.Reader 没有被传递到其他地方,所以关闭它可能是自以为是的。 (2认同)

ale*_*avi 6

按照@shebaw 的说法(至少在 UNIX 操作系统中)调用 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
}
Run Code Online (Sandbox Code Playgroud)
BenchmarkGetFileSize1-8           704618              1662 ns/op
BenchmarkGetFileSize2-8           199461              5668 ns/op
Run Code Online (Sandbox Code Playgroud)