Go语言 | 你还在这样获取文件的大小吗?

开发 后端
在项目中,我们可能会需要获取一个文件的大小,在Golang(Go语言)中,有很多方法来获取一个文件的大小,看看你是否还在用最慢的方式。

在项目中,我们可能会需要获取一个文件的大小,在Golang(Go语言)中,有很多方法来获取一个文件的大小,看看你是否还在用最慢的方式。

[[336484]]

Read字节方式

第一种,是最直观会想到的,也就是打开文件,把文件读取一遍。

  1. func main() { 
  2.     file,err:=os.Open("water"
  3.     if err ==nil { 
  4.         sum := 0 
  5.         buf:=make([]byte,2014) 
  6.         for  { 
  7.             n,err:=file.Read(buf) 
  8.             sum+=n 
  9.             if err==io.EOF { 
  10.                 break 
  11.             } 
  12.         } 
  13.         fmt.Println("file size is ",sum
  14.     } 

这种方式需要打开文件,通过for循环读取文件的字节内容,然后算出文件的大小,这样时也是最不能用的办法,因为效率低,代码量大。

ioutil方式

上面的代码比较啰嗦,这时候我们可能想到了使用ioutil包的ReadFile来代替,直接获得文件的内容,进而计算出文件的大小。

  1. func main() { 
  2.     content,err:=ioutil.ReadFile("water"
  3.     if err == nil { 
  4.         fmt.Println("file size is ",len(content)) 
  5.     } 

通过ioutil.ReadFile函数,我们三行代码就可以搞定,的确方便很多,但是效率慢的问题依然,存在,如果是个很大的文件呢?

Stat方法

继续再进一步,我们不读取文件的内容来计算了,我们通过文件的信息

  1. func main() { 
  2.     file,err:=os.Open("water"
  3.  
  4.     if err == nil { 
  5.         fi,_:=file.Stat() 
  6.         fmt.Println("file size is ",fi.Size()) 
  7.     } 

这种方式不会再读取文件的内容,而是通过Stat方法直接获取,速度会非常快,尤其对于大文件尤其有用。但是它还不是我们今天要讲的终极办法,因为它还是会打开文件,会占用它。

终极方案

好了,我们的终极方案终于要登场了,他的代码也非常简单。

  1. func main() { 
  2.     fi,err:=os.Stat("water"
  3.     if err ==nil { 
  4.         fmt.Println("file size is ",fi.Size(),err) 
  5.     } 

是的,也只需要三行代码即可实现,这里使用的是os.Stat,通过他可以获得文件的元数据信息,现在我们看看它能获取到哪些信息。

获取文件信息

通过os.Stat方法,我们可以获取文件的信息,比如文件大小、名字等。

  1. func main() { 
  2.     fi,err:=os.Stat("water"
  3.     if err ==nil { 
  4.         fmt.Println("name:",fi.Name()) 
  5.         fmt.Println("size:",fi.Size()) 
  6.         fmt.Println("is dir:",fi.IsDir()) 
  7.         fmt.Println("mode::",fi.Mode()) 
  8.         fmt.Println("modTime:",fi.ModTime()) 
  9.     } 

运行这段代码看下结果:

  1. name: water 
  2. size: 403 
  3. is dir: false 
  4. mode:: -rw-r--r-- 
  5. modTime: 2018-05-06 18:52:07 +0800 CST 

以上就是可以获取到的文件信息,还包括判断是否是目录,权限模式和修改时间。所以我们对于文件的信息获取要使用os.Stat函数,它可以在不打开文件的情况下,高效获取文件信息。

判断文件是否存在

os.Stat函数有两个返回值,一个是文件信息,一个是err,通过err我们可以判断文件是否存在。

首先,err==nil的时候,文件肯定是存在的;其次err!=nil的时候也不代表不存在,这时候我们就需要进行严密的判断。

  1. func main() { 
  2.     _,err:=os.Stat("."
  3.     if err ==nil { 
  4.         fmt.Println("file exist"
  5.     }else if os.IsNotExist(err){ 
  6.         fmt.Println("file not exist"
  7.     }else
  8.         fmt.Println(err) 
  9.     } 

通过os.IsNotExist来判断一个文件不存在。最后else的可能性比较少,这个时候可以看下具体的错误是什么,再根据错误来判断文件是否存在。

小结

os.Stat是一个非常好的函数,可以让我们非常高效的获取文件信息,所以在项目中尽可能的使用它。

责任编辑:未丽燕 来源: 飞雪无情
相关推荐

2022-10-24 09:57:02

runeGo语言

2021-03-16 22:44:18

Go语言开发

2014-01-09 14:52:47

创意开源

2012-07-19 10:03:32

2022-02-28 08:11:30

gopsutil网络进程

2019-06-28 15:43:50

编程语言程序员Java

2009-12-11 10:34:15

Linux获取文件大小

2022-02-23 18:36:11

钓鱼邮件数据泄露网络攻击

2023-01-04 11:35:21

预测模型预售

2010-11-23 10:53:40

骑驴找马

2020-04-28 08:55:11

MySQL数据库

2020-01-20 14:30:39

HTTP概念标头

2019-04-08 14:58:36

数据库SQL数据类型

2015-03-04 10:49:30

2021-05-26 08:47:15

Linux系统目录操作系统

2018-05-15 10:34:50

JavaScript语言互联网

2020-10-13 11:04:11

账户密码个人隐私网络安全

2022-03-02 08:01:50

脚本数据集成

2010-12-03 11:32:22

IT业

2020-03-04 14:05:35

戴尔
点赞
收藏

51CTO技术栈公众号