go創建指定大小的文件,獲取文件大小


 

 

package main

import (
    "log"
    "os"
)

var size = int64(1024 )

func main() {
    f, err := os.Create("foobar1.bin")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    if err := f.Truncate(size); err != nil {
        log.Fatal(err)
    }
    // Output:
    //
    finfo, _ := os.Stat("./foobar1.bin")
    log.Println(finfo.Size())

    fi, _ := f.Stat()
    log.Println("f Stat:", fi.Size())
}
                                                             
                                                             

  ---------------

在項目中,我們可能會需要獲取一個文件的大小,在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方法直接獲取,速度會非常快,尤其對於大文件尤其有用。但是它還不是我們今天要講的終極辦法,因為它還是會打開文件,會占用它

終極方案 os.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函數,它可以在不打開文件的情況下,高效獲取文件信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM