在一个项目中,我们可能需要获取一个文件的大小。在Golang(Go语言)中,获取文件大小的方法有很多种。检查您是否仍在使用最慢的方式。Readbytes的第一种方法是我想到的最直观的,就是打开文件读取一次文件。funcmain(){file,err:=os.Open("water")iferr==nil{sum:=0buf:=make([]byte,2014)for{n,err:=file.Read(buf)sum+=niferr==io.EOF{break}}fmt.Println("filesizeis",sum)}}这个方法需要打开文件,通过for循环读取文件的字节内容,然后计算文件的大小文件,这也是最不能用的方法,因为效率低,代码量大。ioutil方法中的上述代码相当冗长。这时候我们可能会想到改用ioutil包的ReadFile,直接获取文件的内容,然后计算文件的大小。funcmain(){content,err:=ioutil.ReadFile("water")iferr==nil{fmt.Println("filesizeis",len(content))}}通过ioutil.ReadFile函数,我们可以搞定三行代码,确实很方便,但是效率慢的问题依然存在。如果是大文件怎么办?Stat方法继续更进一步。我们不读取文件的内容来计算。我们使用文件信息funcmain(){file,err:=os.Open("water")iferr==nil{fi,_:=file.Stat()fmt.Println("filesizeis",fi.Size())}}这个方法不会再读取文件的内容,而是直接通过Stat方法获取,速度会很快,特别适合大文件。但它并不是我们今天要说的最终解决方案,因为它仍然会打开文件并占用它。终极方案好了,我们的终极方案终于出来了,它的代码也很简单。funcmain(){fi,err:=os.Stat("water")iferr==nil{fmt.Println("filesizeis",fi.Size(),err)}}没错,只需要三行代码就可以了是可以实现的。这里我们使用os.Stat,通过它可以获取文件的元数据信息。现在让我们看看它可以获得什么信息。获取文件信息通过os.Stat方法,我们可以获取文件信息,比如文件大小、文件名等。funcmain(){fi,err:=os.Stat("water")iferr==nil{fmt.Println("name:",fi.Name())fmt.Println("size:",fi.Size())fmt.Println("isdir:",fi.IsDir())fmt.Println("mode::",fi.Mode())fmt.Println("modTime:",fi.ModTime())}}运行这段代码看看结果:name:watersize:403isdir:falsemode::-rw-r--r--modTime:2018-05-0618:52:07+0800CST以上是可以得到的文件信息,包括判断是否为目录、权限模式和修改时间。所以我们使用os.Stat函数来获取文件信息,可以在不打开文件的情况下高效的获取文件信息。判断文件是否存在os.Stat函数有两个返回值,一个是文件信息,一个是err。我们可以通过err判断文件是否存在。首先,当err==nil时,文件必须存在;其次,当err!=nil时,并不代表它不存在。这个时候,我们需要做出严格的判断。funcmain(){_,err:=os.Stat(".")iferr==nil{fmt.Println("fileexist")}elseifos.IsNotExist(err){fmt.Println("filenotexist")}else{fmt.Println(err)}}使用os.IsNotExist判断文件不存在。最后else的可能性比较小。这个时候可以看看具体是什么错误,然后根据错误判断文件是否存在。总结os.Stat是一个非常好的函数,可以让我们非常高效的获取文件信息,所以在项目中尽量使用它。
