英文:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论