专栏首页飞雪无情的博客Go语言 | 你还在这样获取文件的大小吗?

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/ ,第一时间看后续精彩文章。觉得好的话,请顺手点个赞吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go是更好的编程语言吗?

    第一次接触GO是5年前,14年4月份,也是在我司,全职钻研一周,彼时C++中毒太深,内心排斥其他编程语言,看其他语法总觉得有点怪,而且有“C/C++能做任何事,...

    AI科技大本营
  • go 语言的库文件放在哪里?如何通过nginx代理后还能正确获取远程地址

    /usr/local/Cellar/go/1.5.1/libexec/src/ ---- 他的RemoteAddr 是从哪里获取? func (c *conn)...

    李海彬
  • 【十问十答】对话Go语言开发团队

    o是谷歌推出的一门编程语言。熟悉Go语言的开发者都知道其弥补了C语言的不足并且保持了C的极简主义。使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、...

    李海彬
  • 持续发烧,聊聊Dart语言的静态编译,能挑战Go不?

    今天,我们再来谈谈 Dart 的另外一大优势,那就是静态编译。估计 php 和 python 直接认输, java 和 go 冷眼旁观?

    汤哥搞开发
  • 再见,Python。你好,Go 语言

    1、Python 和 Go 都是很好的编程语言,不过各擅胜场。Python 更成熟,库多,适合脚本操作和数据分析,在人工智能领域一家独大。Go 比较年轻,有活力...

    py3study
  • 一个专家眼中的Go与Java垃圾回收算法大对比

    我最近看过一堆宣传 Go 语言的最新垃圾收集器的文章。 其中一些文章来自 Go 项目本身。 他们声称 GC 技术发生了根本性的突破。

    华章科技
  • Python和Go都很火,我要怎么选?

    互联网上有大量优秀的代码,它们构成了多种基础架构的基石。甚至本文所在网站的创建初衷也是创建优秀代码。虽然普通用户并没有注意到这一点,但优秀的开发者总是致力于优化...

    机器之心
  • Python和Go都很火,我要怎么选?

    互联网上有大量优秀的代码,它们构成了多种基础架构的基石。甚至本文所在网站的创建初衷也是创建优秀代码。虽然普通用户并没有注意到这一点,但优秀的开发者总是致力于优化...

    CV君
  • 灵魂拷问:Python和Go都很火,我要怎么选?

    互联网上有大量优秀的代码,它们构成了多种基础架构的基石。甚至本文所在网站的创建初衷也是创建优秀代码。虽然普通用户并没有注意到这一点,但优秀的开发者总是致力于优化...

    CDA数据分析师

扫码关注云+社区

领取腾讯云代金券