Go语言 | 你还在这样获取文件的大小吗?
在项目中,我们可能会需要获取一个文件的大小,在Golang(Go语言)中,有很多方法来获取一个文件的大小,看看你是否还在用最慢的方式。
Read字节方式
第一种,是最直观会想到的,也就是打开文件,把文件读取一遍。
func main() {
file,err:=os.Open("water")
if err ==nil {
sum := 0
buf:=make([]byte,2014)
for {
n,err:=file.Read(buf)
sum+=n
if err==io.EOF {
break
}
}
fmt.Println("file size is ",sum)
}
}
这种方式需要打开文件,通过for
循环读取文件的字节内容,然后算出文件的大小,这样时也是最不能用的办法,因为效率低,代码量大。
ioutil方式
上面的代码比较啰嗦,这时候我们可能想到了使用ioutil
包的ReadFile
来代替,直接获得文件的内容,进而计算出文件的大小。
func main() {
content,err:=ioutil.ReadFile("water")
if err == nil {
fmt.Println("file size is ",len(content))
}
}
通过ioutil.ReadFile
函数,我们三行代码就可以搞定,的确方便很多,但是效率慢的问题依然,存在,如果是个很大的文件呢?
Stat方法
继续再进一步,我们不读取文件的内容来计算了,我们通过文件的信息
func main() {
file,err:=os.Open("water")
if err == nil {
fi,_:=file.Stat()
fmt.Println("file size is ",fi.Size())
}
}
这种方式不会再读取文件的内容,而是通过Stat
方法直接获取,速度会非常快,尤其对于大文件尤其有用。但是它还不是我们今天要讲的终极办法,因为它还是会打开文件,会占用它。
终极方案
好了,我们的终极方案终于要登场了,他的代码也非常简单。
func main() {
fi,err:=os.Stat("water")
if err ==nil {
fmt.Println("file size is ",fi.Size(),err)
}
}
是的,也只需要三行代码即可实现,这里使用的是os.Stat
,通过他可以获得文件的元数据信息,现在我们看看它能获取到哪些信息。
获取文件信息
通过os.Stat
方法,我们可以获取文件的信息,比如文件大小、名字等。
func main() {
fi,err:=os.Stat("water")
if err ==nil {
fmt.Println("name:",fi.Name())
fmt.Println("size:",fi.Size())
fmt.Println("is dir:",fi.IsDir())
fmt.Println("mode::",fi.Mode())
fmt.Println("modTime:",fi.ModTime())
}
}
运行这段代码看下结果:
name: water
size: 403
is dir: false
mode:: -rw-r--r--
modTime: 2018-05-06 18:52:07 +0800 CST
以上就是可以获取到的文件信息,还包括判断是否是目录,权限模式和修改时间。所以我们对于文件的信息获取要使用os.Stat
函数,它可以在不打开文件的情况下,高效获取文件信息。
判断文件是否存在
os.Stat
函数有两个返回值,一个是文件信息,一个是err
,通过err
我们可以判断文件是否存在。
首先,err==nil
的时候,文件肯定是存在的;其次err!=nil
的时候也不代表不存在,这时候我们就需要进行严密的判断。
func main() {
_,err:=os.Stat(".")
if err ==nil {
fmt.Println("file exist")
}else if os.IsNotExist(err){
fmt.Println("file not exist")
}else{
fmt.Println(err)
}
}
通过os.IsNotExist
来判断一个文件不存在。最后else
的可能性比较少,这个时候可以看下具体的错误是什么,再根据错误来判断文件是否存在。
小结
os.Stat
是一个非常好的函数,可以让我们非常高效的获取文件信息,所以在项目中尽可能的使用它。
本文为原创文章,转载注明出处,欢迎扫码关注公众号
flysnow_org
或者网站 https://www.flysnow.org/ ,第一时间看后续精彩文章。觉得好的话,请顺手点个赞吧。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 5000字!带你零距离接触websocket!
- 使用 GitLab CI 和 Docker 自动部署 Spring Boot 应用
- 玩转StyleGAN2模型:教你生成动漫人物
- R语言时间序列数据指数平滑法分析交互式动态可视化
- 再见Excel!最强国产开源在线表格Luckysheet走红GitHub
- R语言广义线性模型索赔频率预测:过度分散、风险暴露数和树状图可视化
- R语言多分类logistic逻辑回归模型在混合分布模拟单个风险损失值评估的应用
- sas神经网络:构建人工神经网络模型来识别垃圾邮件
- 图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正
- 手写dubbo框架9-SPI实现
- R语言非参数模型厘定保险费率:局部回归、广义相加模型GAM、样条回归
- VsCode插件之Live Serve探秘.(上)
- R语言小数定律的保险业应用:泊松分布模拟索赔次数
- R语言中自编基尼系数的CART回归决策树的实现
- Docker hello world