首頁 > 軟體

Go語言檔案讀寫操作案例詳解

2022-09-26 14:04:54

基本介紹

檔案,對我們並不陌生,檔案是資料來源(儲存資料的地方)的 一種

輸入流和輸出流 檔案在程式中是以流的形式來操作的

:資料在資料來源(檔案)和程式(記憶體)之間經歷的路徑 輸入流:資料從檔案到記憶體的路徑 輸出流:資料從記憶體到檔案的路徑

  • os.File封裝所有檔案相關操作,File是一個結構體

檔案基本操作

讀操作

package main
import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"mahonia"
	"os"
)
func main() {
	//防止控制檯中文亂碼 如果是Golang編譯則需要安裝第三方轉碼包git clone https://github.com/axgle/mahonia.git
	var enc mahonia.Decoder
	enc = mahonia.NewDecoder("gbk")
	//讀取檔案的內容並顯示在終端,使用os.Open, file.Close, bufio.NewReader(), reader.ReadString
	//開啟檔案 file,err:=os.Open(檔案的絕對路徑)
	file,err:=os.Open("F:/test.txt")
	if err !=nil{
		fmt.Println("open file err=",err)
	}
	//關閉檔案
	defer file.Close()  //要及時關閉檔案,否則會有記憶體洩露
	//建立一個"Reader",帶快取 預設快取大小為4096 reader:=bufio.NewReader(file)
	reader:=bufio.NewReader(file)
	//讀取檔案的內容
	for{
		str,err:=reader.ReadString('n')
		fmt.Print(enc.ConvertString(str))
		/*
			你好啊
			真的很好asdb
			123
		*/
		if err ==io.EOF{// 檔案末尾
			break
		}
	}
	//一次性讀取檔案內容,適用於檔案較小的    無需開啟和關閉檔案
	// 使用 ioutil.ReadFile content為byte[]
	content,err:=ioutil.ReadFile("f:/test.txt")
	if err!=nil{
		fmt.Println("read file err=",err)
	}
	fmt.Print(enc.ConvertString(string(content)))
	/*
	你好啊
	真的很好asdb
	123
	*/
}

寫操作

檔案開啟函數 func OpenFile(name string,flag int,perm FileMode)(file *File,err error)

package main
import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"mahonia"
	"os"
)
func main() {
	//Read1()
	//Read2("f:/test.txt",'gbk')
	/*
	你好啊
	真的很好asdb
	123
	你好啊
	真的很好asdb
	123
	*/
	//建立一個新檔案,寫入內容 5句 "hello,Gardon"
	//Write()
	//開啟一個存在的檔案中,將原來的內容覆蓋成新的內容10句,"你好,世界!!"
	//Write2()
	//開啟一個存在的 檔案,將原來的內容追加內容"ABC! ENGLISH!"
	//Write3()
	//開啟一個存在的檔案,將原來的內容讀出顯示在終端,並追加5句"hello,北京"
	Write4()
}
func Read1(){
	//防止控制檯中文亂碼 如果是Golang編譯則需要安裝第三方轉碼包git clone https://github.com/axgle/mahonia.git
	var enc mahonia.Decoder
	enc = mahonia.NewDecoder("gbk")
	//讀取檔案的內容並顯示在終端,使用os.Open, file.Close, bufio.NewReader(), reader.ReadString
	//開啟檔案 file,err:=os.Open(檔案的絕對路徑)
	file,err:=os.Open("F:/test.txt")
	if err !=nil{
		fmt.Println("open file err=",err)
	}
	//關閉檔案
	defer file.Close()  //要及時關閉檔案,否則會有記憶體洩露
	//建立一個"Reader",帶快取 預設快取大小為4096 reader:=bufio.NewReader(file)
	reader:=bufio.NewReader(file)
	//讀取檔案的內容
	for{
		str,err:=reader.ReadString('n')
		fmt.Print(enc.ConvertString(str))
		/*
			你好啊
			真的很好asdb
			123
		*/
		if err ==io.EOF{// 檔案末尾
			break
		}
	}
}
func Read2(filename string,encode string){
	var enc mahonia.Decoder
	enc = mahonia.NewDecoder(encode)
	//一次性讀取檔案內容,適用於檔案較小的    無需開啟和開啟檔案
	// 使用 ioutil.ReadFile content為byte[]
	content,err:=ioutil.ReadFile(filename)
	if err!=nil{
		fmt.Println("read file err=",err)
	}
	fmt.Print(enc.ConvertString(string(content)))
}
func Write(){
	filename:="f:/test2.txt"
	//建立檔案,並以只寫形式開啟
	file,err:=os.OpenFile(filename,os.O_CREATE |os.O_WRONLY,0666)
	if err !=nil{
		fmt.Println("open file err=",err)
		return
	}
	defer file.Close()
	//寫入內容
	str:="hello,Gardonrn"
	//寫入時,帶有快取的*Writer
	writer:=bufio.NewWriter(file)
	for i:=0;i<5 ;i++  {
		writer.WriteString(str)
	}
	//重新整理快取
	writer.Flush()
	//讀取檔案
	Read2(filename,"gbk")
	/*
	hello,Gardon
	hello,Gardon
	hello,Gardon
	hello,Gardon
	hello,Gardon
	*/
}
func Write2(){
	filename:="f:/test2.txt"
	//建立檔案,並以只寫形式開啟
	file,err:=os.OpenFile(filename,os.O_CREATE |os.O_TRUNC,0666)
	if err !=nil{
		fmt.Println("open file err=",err)
		return
	}
	defer file.Close()
	//寫入內容
	str:="你好,世界!!rn"
	//寫入時,帶有快取的*Writer
	writer:=bufio.NewWriter(file)
	for i:=0;i<10 ;i++  {
		writer.WriteString(str)
	}
	//重新整理快取
	writer.Flush()
	//讀取檔案
	Read2(filename,"utf-8")
	/*
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
	*/
}
func Write3(){
	filename:="f:/test2.txt"
	//建立檔案,並以只寫形式開啟
	file,err:=os.OpenFile(filename,os.O_CREATE |os.O_APPEND,0666)
	if err !=nil{
		fmt.Println("open file err=",err)
		return
	}
	defer file.Close()
	//寫入內容
	str:="ABC! ENGLISH!rn"
	//寫入時,帶有快取的*Writer
	writer:=bufio.NewWriter(file)
	writer.WriteString(str)
	//重新整理快取
	writer.Flush()
	//讀取檔案
	Read2(filename,"utf-8")
	/*
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		ABC! ENGLISH!
	*/
}
func Write4(){
	filename:="f:/test2.txt"
	//建立檔案,並以只寫形式開啟
	file,err:=os.OpenFile(filename,os.O_RDWR |os.O_APPEND,0666)
	if err !=nil{
		fmt.Println("open file err=",err)
		return
	}
	defer file.Close()
	//追加內容
	Read2(filename,"utf-8")
	/*
	你好,世界!!
	你好,世界!!
	你好,世界!!
	你好,世界!!
	你好,世界!!
	你好,世界!!
	你好,世界!!
	你好,世界!!
	你好,世界!!
	你好,世界!!
	ABC! ENGLISH!
	*/
	str:="hello,北京rn"
	//寫入時,帶有快取的*Writer
	writer:=bufio.NewWriter(file)
	writer.WriteString(str)
	//重新整理快取
	writer.Flush()
	//讀取檔案
	Read2(filename,"utf-8")
	/*
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		你好,世界!!
		ABC! ENGLISH!
		hello,北京
	*/
}

寫操作案例

檢視檔案或目錄是否存在

package main
import (
	"fmt"
	"os"
)
func main() {
	fmt.Println(PathExists("f:/test2.txt")) //true <nil>
	fmt.Println(PathExists("f:/test3.txt")) //false <nil>
}
func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	//如果返回的錯誤為nil,說明檔案或資料夾存在
	if err == nil {
		return true, nil
	}
	//如果返回的錯誤型別使用os.IsNotExist()判斷為true,說明檔案或資料夾不存在
	if os.IsNotExist(err){
		return false, nil
	}
	//如果返回的 錯誤為其他型別,則不確定是否在存在
	return false,err
}

拷貝檔案

package main
import (
	"bufio"
	"fmt"
	"io"
	"os"
)
func main() {
	fmt.Println(PathExists("f:/test2.txt")) //true <nil>
	fmt.Println(PathExists("f:/test3.txt")) //false <nil>
	written,err:=CopyFile("f:/test3.txt","f:/test2.txt")
	if err!=nil{
		fmt.Println("拷貝失敗!!")
	}else{
		fmt.Println("拷貝成功!!")
	}
	fmt.Println(written)
}
func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	//如果返回的錯誤為nil,說明檔案或資料夾存在
	if err == nil {
		return true, nil
	}
	//如果返回的錯誤型別使用os.IsNotExist()判斷為true,說明檔案或資料夾不存在
	if os.IsNotExist(err){
		return false, nil
	}
	//如果返回的 錯誤為其他型別,則不確定是否在存在
	return false,err
}
func CopyFile(writerFileName string,readerFileName string) (written int64,err error){
	ReaderFile,err2:=os.Open(readerFileName)
	WriterFlag,_:=PathExists(writerFileName)
	var WriterFile *os.File
	if WriterFlag{
		WriterFile,err=os.OpenFile(writerFileName,os.O_WRONLY |os.O_TRUNC,0666)
	}else{
		WriterFile,err=os.OpenFile(writerFileName,os.O_WRONLY |os.O_CREATE,0666)
	}
	if err !=nil{
		fmt.Println("file open err=",err)
		return
	}
	writer:=bufio.NewWriter(WriterFile)
	defer WriterFile.Close()
	if err2 !=nil{
		fmt.Println("file open err=",err2)
		return
	}
	defer ReaderFile.Close()
	reader:=bufio.NewReader(ReaderFile)
	return io.Copy(writer,reader)
}

以上就是Go語言檔案讀寫操作案例詳解的詳細內容,更多關於Go語言檔案讀寫操作的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com