1. 程式人生 > 其它 >go語言檔案系統

go語言檔案系統

檢測檔案是否存在

//存在返回 true,不存在返回 false
func fileIfExist(filename string) bool {
    _, err := os.Stat(filename)
    if nil != err {
        fmt.Println(filename, "is not exist!")
        return false
    }

    if os.IsNotExist(err) {
        return false
    }

    return true
}

開啟檔案

f, err := os.Open(filename)
if nil != err {
    fmt.Println("open", filename, "failed!")
    return
}
defer f.Close()

如果檔案不存在,就會返回錯誤,如果存在就以只讀的方式開啟檔案。

還可以使用 os.OpenFile() 開啟檔案,達到不存在就新建,存在就清空(os.O_TRUNC)的目的。當然,也可以不清空檔案(os.O_APPEND)。

f, err := os.OpenFile(filename, os.O_RDWR | os.O_CREATE | os.O_TRUNC, 0666)
if nil != err {
    fmt.Println("create", filename, "failed!")    
    return
}
defer f.Close()

新建檔案

f, err := os.Create(filename)
if nil != err {
    fmt.Println("create", filename, "failed!")
    return
}
defer f.Close()

注意:如果檔案已經存在,那麼 os.Create() 會將檔案清空。可以使用 os.OpenFile() 新建檔案, 引數 flagos.O_CREATE | os.O_EXCL。如果檔案已經存在,那麼該函式就會返回錯誤。

f, err := os.OpenFile(filename, os.O_CREATE | os.O_EXCL, 0666)
if nil != err {
    fmt.Println("create", filename, "failed!")    
    return
}
defer f.Close()

讀取檔案

讀取全部內容

content := make([]byte, 1024)   //需要預先分配空間
f, _ := os.Open(filename)
defer f.Close()
_, err := f.Read(content)
if nil != err {
    fmt.Println("read", filename, "failed!")
    return
}

讀取檔案內容可以使用 File 的方法——Read。但是使用該方法時需要預先分配空間,用於儲存讀取的檔案內容。我們當然可以提前獲取檔案的大小,但是這種方式仍然不如 ioutil.ReadAll() 方便。甚至可以直接使用 ioutil.ReadFile()

ioutil.ReadAll()

f, _ := os.Open(filename)
defer f.Close()
content, err := ioutil.ReadAll(f)
if nil != err {
    fmt.Println("read", filename, "failed!")
    return
}
fmt.Println(string(content))

ioutil.ReadFile()

content, err := ioutil.ReadFile(filename)
if nil != err {
    fmt.Println("read", filename, "failed!")
    return
}
fmt.Println(string(content))

按行讀取

f, _ := os.Open(filename)
defer f.Close()
scanner := bufio.NewScanner(f) //按行讀取
for scanner.Scan() {
    fmt.Println(scanner.Text()) //輸出檔案內容
}

寫入檔案

f, _ := os.OpenFile(filename, os.O_WRONLY | os.O_APPEND, 0666)
defer f.Close()
_, err = f.WriteString("target_compile_option")
if nil != err {
    fmt.Println(err)
}

這裡使用 os.OpenFile() 以追加的方式開啟檔案。為什麼不使用 os.Open() 開啟檔案呢?因為 os.Open() 是以只讀的方式開啟檔案,無法向檔案寫入資料。

我們也可以使用 ioutil.WriteFile() 寫檔案。

writeContent := "write file test"
err = ioutil.WriteFile(filename, []byte(writeContent), os.ModePerm)
if nil != err {
    fmt.Println("write", filename, "failed!")
}

注意:使用 ioutil.WriteFile(filename string, data []byte, perm os.FileMode) 向檔案中寫入時,如果檔案存在,檔案會先被清空,然後再寫入。如果檔案不存在,就會以 perm 許可權先建立檔案,然後再寫入。

關閉檔案

直接呼叫 FileClose() 方法。

f, _ := os.Open(filename)
f.Close()

最好使用 defer 關鍵字執行 Close() 方法,這樣能夠保證函式退出時檔案能被關閉。

刪除檔案

err := os.Remove(filename)

刪除檔案前確保檔案沒有被其他程式使用。如果在當前程式中該檔案已被開啟,需要先關閉(Close())檔案。