GO 文件操作

簡介

常見的文件操作:讀、寫、追加、複製,在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

http://doc.golang.ltd/

關於文件權限

參考: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代表這是個文件

image-20230205172800385

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,並寫入
image-20230205174717672

打開文件並追加

打開一個存在的文件,在原來的內容追加內容“好帥”

// 主要內容
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()
}

文件內容

image-20230205175210771

讀取追加文件並輸出

打開一個存在的文件,將原來的內容讀出來,顯示在終端,並且追加 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()
}

執行結果

image-20230205180737016

image-20230205180800432

創建文件並複製文件內容

創建一個新文件 ,將原文件的內容複製到新文件

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)
	}
}

執行成功後

image-20230205181713621

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章