簡介
常見的文件操作:讀、寫、追加、複製,在go語言中標準庫os
提供了Openfile
函數來進行此類操作,其原型如下:
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
- name 是文件的文件名,如果不是在當前路徑下運行需要加上具體路徑;
- flag 是文件的處理參數,爲 int 類型,根據系統的不同具體值可能有所不同,但是作用是相同的;
- perm 是文件的操作權限, 一般是0開頭 後跟 權限777 ,同linux中的 文件權限一樣, 1 爲執行、 2爲寫、4爲讀。
詳細文檔參考:
https://www.topgoer.cn/docs/golangstandard/golangstandard-1cmkt0g1jv29k
關於文件權限
參考:https://www.runoob.com/linux/linux-file-attr-permission.html
文件的權限:
r 表示可讀取,w 表示可寫入,x 表示可執行,
分別表示爲數字爲r=4,w=2,x=1;
第一位:0 表示是文件
權限又按用戶的不同分爲三類:
(第二位)User(該文件擁有者的權限)、
(第三位)Group(該文件擁有者所在組的其他成員對該文件的操作權限)
(第四位Other(其他用戶組的成員對該文件的操作權限)
如:
對於User用戶,若擁有rw權限,則爲4+2=6,
所以0666中的666代表User、Group、及Other的權限分別是6,6,6,即均爲rw權限。
而0666中的0代表這是個文件
flag參數
常用的 flag 文件處理參數:
- O_RDONLY:只讀模式打開文件;
- O_WRONLY:只寫模式打開文件;
- O_RDWR:讀寫模式打開文件;
- O_APPEND:寫操作時將數據附加到文件尾部(追加);
- O_CREATE:如果不存在將創建一個新文件;
- O_EXCL:和 O_CREATE 配合使用,文件必須不存在,否則返回一個錯誤;
- O_SYNC:當進行一系列寫操作時,每次都要等待上次的 I/O 操作完成再進行;
- O_TRUNC:如果可能,在打開時清空文件。
文件創建並寫入
創建一個新文件 golang.txt,並在其中寫入 5 句“hello makalo”。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
//創建一個新文件,寫入內容 5 句 “hello makalo”
// 絕對路徑
// filePath := "E:/GoCode/hello/test.txt"
// 相對路徑
filePath := "./test.txt"
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println("文件打開失敗", err)
}
//及時關閉file句柄
defer file.Close()
//寫入文件時,使用帶緩存的 *Writer
write := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
write.WriteString("hello makalo \n")
}
//Flush將緩存的文件真正寫入到文件中
write.Flush()
}
執行成功之後在當前目錄下創建一個test.txt
,並寫入
打開文件並追加
打開一個存在的文件,在原來的內容追加內容“好帥”
// 主要內容
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_APPEND, 0666)
完整代碼
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
//創建一個新文件,寫入內容 5 句 “hello makalo”
// 絕對路徑
// filePath := "E:/GoCode/hello/test.txt"
// 相對路徑
filePath := "./test.txt"
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
fmt.Println("文件打開失敗", err)
}
//及時關閉file句柄
defer file.Close()
//寫入文件時,使用帶緩存的 *Writer
write := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
write.WriteString("好帥 \n")
}
//Flush將緩存的文件真正寫入到文件中
write.Flush()
}
文件內容
讀取追加文件並輸出
打開一個存在的文件,將原來的內容讀出來,顯示在終端,並且追加 5 句“玉樹臨風”。
注意:當追加和讀取同時存在,同時存在,會先讀再寫
// 主要內容
file, err := os.OpenFile(filePath, os.O_RDWR|os.O_APPEND, 0666)
完整代碼
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
//創建一個新文件,寫入內容 5 句 “hello makalo”
// 絕對路徑
// filePath := "E:/GoCode/hello/test.txt"
// 相對路徑
filePath := "./test.txt"
file, err := os.OpenFile(filePath, os.O_RDWR|os.O_APPEND, 0666)
if err != nil {
fmt.Println("文件打開失敗", err)
}
//及時關閉file句柄
defer file.Close()
//讀原來文件的內容,並且顯示在終端
reader := bufio.NewReader(file)
for {
str, err := reader.ReadString('\n')
if err == io.EOF {
break
}
fmt.Print(str)
}
//寫入文件時,使用帶緩存的 *Writer
write := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
write.WriteString("玉樹臨風 \n")
}
//Flush將緩存的文件真正寫入到文件中
write.Flush()
}
執行結果
創建文件並複製文件內容
創建一個新文件 ,將原文件的內容複製到新文件
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
// 文件1 已存在
file1Path := "./test.txt"
// 文件2 不存在
file2Path := "./test2.txt"
// 創建文件2
file, err := os.OpenFile(file2Path, os.O_CREATE, 0666)
if err != nil {
fmt.Println("文件創建失敗", err)
}
//關閉file句柄
file.Close()
// 內容複製
data, err := ioutil.ReadFile(file1Path)
if err != nil {
fmt.Printf("文件打開失敗=%v\n", err)
return
}
err = ioutil.WriteFile(file2Path, data, 0666)
if err != nil {
fmt.Printf("文件打開失敗=%v\n", err)
}
}
執行成功後