golang 寫文件--詳細解釋


1,不覆蓋指定的文件

先看代碼怎么寫,下面再具體解釋.

func writeToFile(msg string)  {
	f, err := os.OpenFile("/home/mingbai/del/koala.log", os.O_WRONLY&os.O_CREATE, 0666)
	if err != nil {
		log.Println(err.Error())
	}

	_, err = f.Write([]byte(msg))
	if err != nil {
		log.Println(err.Error())
	}
	f.Close()
}

OpenFile 這個函數不那么好理解,解釋一下. 第一個參數 就是文件路徑.

第二個參數是一個 文件打開方式的flag是讀是寫 還是讀寫;是追加還是清空等, 第一種類型同第二種類型可用'|' (與或非的或)操作連接,表示兩個都要. 其實你還可以加三個,比如:os.O_WRONLY|os.O_CREATE|os.O_APPEND 表示寫模式打開,沒有則創建且追加的方式寫入.

第三個參數是操作文件的權限, 就是Linux 文件權限的那種4 讀,2 寫, 1 執行; 可累加.比較常見,不多解釋了.

flag 有下面這些參數可選:

// Flags to OpenFile wrapping those of the underlying system. Not all
// flags may be implemented on a given system.
const (
	// Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
	O_RDONLY int = syscall.O_RDONLY // open the file read-only.
	O_WRONLY int = syscall.O_WRONLY // open the file write-only.
	O_RDWR   int = syscall.O_RDWR   // open the file read-write.
	// The remaining values may be or'ed in to control behavior.
	O_APPEND int = syscall.O_APPEND // append data to the file when writing.
	O_CREATE int = syscall.O_CREAT  // create a new file if none exists.
	O_EXCL   int = syscall.O_EXCL   // used with O_CREATE, file must not exist.
	O_SYNC   int = syscall.O_SYNC   // open for synchronous I/O.
	O_TRUNC  int = syscall.O_TRUNC  // truncate regular writable file when opened.
)

英文版不想看? 沒事兒, 我這還有中文版!


    O_RDONLY 以只讀文式打開文件。
    O_WRONLY 以只寫方式打開文件。
    O_RDWR 以讀寫方式打開文件
    O_APPEND 以追加方式打開文件,寫入的數據將追加到文件尾。
    O_CREATE 當文件不存在時創建文件。
    O_EXCL 與 O_CREATE 一起使用,當文件已經存在時 Open 操作失敗。
    O_SYNC 以同步方式打開文件。每次 write 系統調用后都等待實際的物理 I/O 完成后才返回,默認(不使用該標記)是使用緩沖的,也就是說每次的寫操作是寫到系統內核緩沖區中,等系統緩沖區滿后才寫到實際存儲設備。
    O_TRUNC 如果文件已存在,打開時將會清空文件內容。必須於 O_WRONLY 或 O_RDWR 配合使用。截斷文件,需要有寫的權限。

2, ioutil 會覆蓋文件的內容

ioutil 也能很方便的讀寫文件,但是類似下面這樣寫會覆蓋文件的內容,有時候不符合需求.

func writeToFile2(msg string)  {
	if err := ioutil.WriteFile("/home/mingbai/del/koala.log", []byte("hello"), 777); err != nil{
		os.Exit(111)
		log.Println(err.Error())
	}
}

有用的話點個贊哦~


免責聲明!

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



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