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

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

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,代码类似于:

fi, err := f.Stat()
if err != nil {
  // 无法获取文件信息,处理错误
}

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

fi, err := f.Stat()
if err != nil {
  // Could not obtain stat, handle error
}

fmt.Printf("The file is %d bytes long", fi.Size())

答案2

得分: 117

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

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

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

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

答案3

得分: 20

稍微详细一点的回答:

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() )
英文:

Slightly more verbose answer:

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

答案4

得分: 15

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

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

这里是基准测试结果

func GetFileSize1(filepath string) (int64, error) {
    fi, err := os.Stat(filepath)
    if err != nil {
        return 0, err
    }
    // 获取文件大小
    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
英文:

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

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

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:

确定