Go語言 | 你還在這樣獲取文件的大小嗎?
在項目中,我們可能會需要獲取一個文件的大小,在Golang(Go語言)中,有很多方法來獲取一個文件的大小,看看你是否還在用最慢的方式。
Read字節(jié)方式
第一種,是最直觀會想到的,也就是打開文件,把文件讀取一遍。
- 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循環(huán)讀取文件的字節(jié)內(nèi)容,然后算出文件的大小,這樣時也是最不能用的辦法,因為效率低,代碼量大。
ioutil方式
上面的代碼比較啰嗦,這時候我們可能想到了使用ioutil包的ReadFile來代替,直接獲得文件的內(nèi)容,進而計算出文件的大小。
- func main() {
- content,err:=ioutil.ReadFile("water")
- if err == nil {
- fmt.Println("file size is ",len(content))
- }
- }
通過ioutil.ReadFile函數(shù),我們?nèi)写a就可以搞定,的確方便很多,但是效率慢的問題依然,存在,如果是個很大的文件呢?
Stat方法
繼續(xù)再進一步,我們不讀取文件的內(nèi)容來計算了,我們通過文件的信息
- func main() {
- file,err:=os.Open("water")
- if err == nil {
- fi,_:=file.Stat()
- fmt.Println("file size is ",fi.Size())
- }
- }
這種方式不會再讀取文件的內(nèi)容,而是通過Stat方法直接獲取,速度會非常快,尤其對于大文件尤其有用。但是它還不是我們今天要講的終極辦法,因為它還是會打開文件,會占用它。
終極方案
好了,我們的終極方案終于要登場了,他的代碼也非常簡單。
- func main() {
- fi,err:=os.Stat("water")
- if err ==nil {
- fmt.Println("file size is ",fi.Size(),err)
- }
- }
是的,也只需要三行代碼即可實現(xiàn),這里使用的是os.Stat,通過他可以獲得文件的元數(shù)據(jù)信息,現(xiàn)在我們看看它能獲取到哪些信息。
獲取文件信息
通過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())
- }
- }
運行這段代碼看下結(jié)果:
- name: water
- size: 403
- is dir: false
- mode:: -rw-r--r--
- modTime: 2018-05-06 18:52:07 +0800 CST
以上就是可以獲取到的文件信息,還包括判斷是否是目錄,權(quán)限模式和修改時間。所以我們對于文件的信息獲取要使用os.Stat函數(shù),它可以在不打開文件的情況下,高效獲取文件信息。
判斷文件是否存在
os.Stat函數(shù)有兩個返回值,一個是文件信息,一個是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的可能性比較少,這個時候可以看下具體的錯誤是什么,再根據(jù)錯誤來判斷文件是否存在。
小結(jié)
os.Stat是一個非常好的函數(shù),可以讓我們非常高效的獲取文件信息,所以在項目中盡可能的使用它。