【问题标题】:How to get file length in Go?如何在 Go 中获取文件长度?
【发布时间】:2013-06-16 12:58:24
【问题描述】:

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

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

【问题讨论】:

    标签: file go


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        稍微详细一点的答案:

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

        【讨论】:

        • 可能是defer file.Close()Stat() 之前?
        • @Timmmm 是的 - 但由于这是一个代码 sn-p,我们不能假设 fiio.Reader 没有在其他地方传递,因此关闭它可能是冒昧的。跨度>
        【解决方案4】:

        @shebaw 所说的调用 os.Stat(至少在 UNIX 操作系统中)效率更高,原因是 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-15
          • 2010-10-31
          • 2019-04-18
          • 1970-01-01
          • 1970-01-01
          • 2013-09-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多