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())
}
}
有用的話點個贊哦~