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

huangapple go评论113阅读模式
英文:

How to get file length in Go?

问题

我查了golang.org/pkg/os/#File,但还是不明白。
似乎没有办法获取文件长度,我有遗漏什么吗?

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

英文:

I looked up golang.org/pkg/os/#File , but still have no idea.
Seems there is no way to get file length, did I miss something?

How to get file length in Go?

答案1

得分: 165

(*os.File).Stat() 返回一个 os.FileInfo 值,该值具有一个 Size() 方法。因此,给定一个文件 f,代码类似于:

  1. fi, err := f.Stat()
  2. if err != nil {
  3. // 无法获取文件信息,处理错误
  4. }
  5. fmt.Printf("文件大小为 %d 字节", fi.Size())
英文:

(*os.File).Stat() returns a os.FileInfo value, which in turn has a Size() method. So, given a file f, the code would be akin to

  1. fi, err := f.Stat()
  2. if err != nil {
  3. // Could not obtain stat, handle error
  4. }
  5. fmt.Printf("The file is %d bytes long", fi.Size())

答案2

得分: 117

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

  1. fi, err := os.Stat("/path/to/file")
  2. if err != nil {
  3. return err
  4. }
  5. // 获取文件大小
  6. size := fi.Size()
英文:

If you don't want to open the file, you can directly call os.Stat instead.

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

答案3

得分: 20

稍微详细一点的回答:

  1. file, err := os.Open( filepath )
  2. if err != nil {
  3. log.Fatal(err)
  4. }
  5. fi, err := file.Stat()
  6. if err != nil {
  7. log.Fatal(err)
  8. }
  9. fmt.Println( fi.Size() )
英文:

Slightly more verbose answer:

  1. file, err := os.Open( filepath )
  2. if err != nil {
  3. log.Fatal(err)
  4. }
  5. fi, err := file.Stat()
  6. if err != nil {
  7. log.Fatal(err)
  8. }
  9. fmt.Println( fi.Size() )

答案4

得分: 15

调用os.Stat(如@shebaw所说,至少在UNIX操作系统中)更高效,因为stat()是一个Unix系统调用,返回有关inode的文件属性,并且不需要打开文件进行处理。

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

这里是基准测试结果

  1. func GetFileSize1(filepath string) (int64, error) {
  2. fi, err := os.Stat(filepath)
  3. if err != nil {
  4. return 0, err
  5. }
  6. // 获取文件大小
  7. return fi.Size(), nil
  8. }
  9. func GetFileSize2(filepath string) (int64, error) {
  10. f, err := os.Open(filepath)
  11. if err != nil {
  12. return 0, err
  13. }
  14. defer f.Close()
  15. fi, err := f.Stat()
  16. if err != nil {
  17. return 0, err
  18. }
  19. return fi.Size(), nil
  20. }
  1. BenchmarkGetFileSize1-8 704618 1662 ns/op
  2. BenchmarkGetFileSize2-8 199461 5668 ns/op
英文:

Calling os.Stat as sayed by @shebaw (at least in UNIX OS) is more efficient, cause stat() is a Unix system call that returns file attributes about an inode, and is not necessary to deal with open the file.

NOTE: Using other method can lead to too many open files in multithread/concurrency application, due to the fact that you open the file for query the stats

Here the benchmark

  1. func GetFileSize1(filepath string) (int64, error) {
  2. fi, err := os.Stat(filepath)
  3. if err != nil {
  4. return 0, err
  5. }
  6. // get the size
  7. return fi.Size(), nil
  8. }
  9. func GetFileSize2(filepath string) (int64, error) {
  10. f, err := os.Open(filepath)
  11. if err != nil {
  12. return 0, err
  13. }
  14. defer f.Close()
  15. fi, err := f.Stat()
  16. if err != nil {
  17. return 0, err
  18. }
  19. return fi.Size(), nil
  20. }
  1. BenchmarkGetFileSize1-8 704618 1662 ns/op
  2. BenchmarkGetFileSize2-8 199461 5668 ns/op

huangapple
  • 本文由 发表于 2013年6月16日 20:58:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/17133590.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定