Go語言學習筆記18.文件操作

系統函數

func Create(name string) (file *File, err Error)
根據提供的文件名創建新的文件,返回一個文件對象,默認權限是0666的文件,返回的文件對象是可讀寫的。

func NewFile(fd uintptr, name string) *File
根據文件描述符創建相應的文件,返回一個文件對象

func Open(name string) (file *File, err Error)
該方法打開一個名稱爲name的文件,但是是隻讀方式,內部實現其實調用了OpenFile。

func OpenFile(name string, flag int, perm uint32) (file *File, err Error)
打開名稱爲name的文件,flag是打開的方式,只讀、讀寫等,perm是權限

func (file *File) Write(b []byte) (n int, err Error)
寫入byte類型的信息到文件

func (file *File) WriteAt(b []byte, off int64) (n int, err Error)
在指定位置開始寫入byte類型的信息

func (file *File) WriteString(s string) (ret int, err Error)
寫入string信息到文件

func (file *File) Read(b []byte) (n int, err Error)
讀取數據到b中

func (file *File) ReadAt(b []byte, off int64) (n int, err Error)
從off開始讀取數據到b中

func Remove(name string) Error
調用該函數就可以刪除文件名爲name的文件

封裝函數

package myLib2

import (
	"bufio"
	"fmt"
	"io"
	"os"
)
//打開文件
func CreateFile(path string) os.File {
	fout, err := os.Create(path)
	if err != nil {
		fmt.Println(err)
	}
	return *fout
}
//寫字符
func WriteByte(f os.File,b []byte) {
	f.Write(b)
}
//寫字符串
func WriteString(f os.File, input string) {
	f.WriteString(input)
}
//讀文件所有內容
func ReadFile(path string) {
	//打開文件
	f, err := os.Open(path)
	if err != nil {
		fmt.Println("err = ", err)
		return
	}

	//關閉文件
	defer f.Close()

	buf := make([]byte, 1024*2) //2k大小

	//n代表從文件讀取內容的長度
	n, err1 := f.Read(buf)
	if err1 != nil && err1 != io.EOF { //文件出錯,同時沒有到結尾
		fmt.Println("err1 = ", err1)
		return
	}
	fmt.Println("buf = ", string(buf[:n]))
}

//每次讀取一行
func ReadFileLine(path string) {
	//打開文件
	f, err := os.Open(path)
	if err != nil {
		fmt.Println("err = ", err)
		return
	}

	//關閉文件
	defer f.Close()

	//新建一個緩衝區,把內容先放在緩衝區
	r := bufio.NewReader(f)

	for {
		//遇到'\n'結束讀取, 但是'\n'也讀取進入
		buf, err := r.ReadBytes('\n')
		if err != nil {
			if err == io.EOF { //文件已經結束
				break
			}
			fmt.Println("err = ", err)
		}

		fmt.Printf("buf = #%s#\n", string(buf))
	}

}

func main() {

	fout := myLib2.CreateFile("./test2.txt")

	defer fout.Close() //main函數結束前, 關閉文件

	outstr := fmt.Sprintf("%s:%d\n", "Hello go", 1)
	myLib2.WriteString(fout, outstr)         //寫入string信息到文件
	myLib2.WriteByte(fout, []byte("abcd\n")) //寫入byte類型的信息到文件

	//將標準輸入寫入文件
	var a string
	fmt.Println("請輸入a: ")
	fmt.Scan(&a) //從標準輸入設備中讀取內容,放在a中
	fmt.Println("a = ", a)
	myLib2.WriteString(fout, a)

	//讀文件
	myLib2.ReadFile("./test.txt")
	myLib2.ReadFileLine("./test.txt")
}

文件拷貝

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	list := os.Args //獲取命令行參數
	if len(list) != 3 {
		fmt.Println("參數不正確")
		return
	}

	srcFileName := list[1]
	dstFileName := list[2]
	if srcFileName == dstFileName {
		fmt.Println("源文件和目的文件名字不能相同")
		return
	}

	//只讀方式打開源文件
	sF, err1 := os.Open(srcFileName)
	if err1 != nil {
		fmt.Println("err1 = ", err1)
		return
	}

	//新建目的文件
	dF, err2 := os.Create(dstFileName)
	if err2 != nil {
		fmt.Println("err2 = ", err2)
		return
	}

	//操作完畢,需要關閉文件
	defer sF.Close()
	defer dF.Close()

	//核心處理,從源文件讀取內容,往目的文件寫,讀多少寫多少
	buf := make([]byte, 4*1024) //4k大小臨時緩衝區
	for {
		n, err := sF.Read(buf) //從源文件讀取內容
		if err != nil {
			if err == io.EOF { //文件讀取完畢
				break
			}else{
				fmt.Println("err = ", err)
			}
		}
		//往目的文件寫,讀多少寫多少
		dF.Write(buf[:n])
	}
	fmt.Println("拷貝完成!")
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章