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