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

时间:2013-06-16 12:58:24

标签: file go

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

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

3 个答案:

答案 0 :(得分:89)

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

答案 1 :(得分:35)

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

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

答案 2 :(得分:2)

如@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