Go之文件操作


一:os.File封裝了所有與文件操作有關的操作,File是結構體

①:常用操作

  ①:Read()舉例,Read()取出len(b)的字節數據,並寫入b中

package main

import (
	"fmt"
	"os"
)

func main() {
	path := "d:/abc.txt"
	file, err := os.Open(path)
	if err != nil {
		fmt.Printf("err=%v",err)
		return
	}
	defer file.Close()
	b := make([]byte, 5)
	count, err := file.Read(b)
	if err != nil {
		fmt.Printf("err=",err)
		return
	}
	fmt.Println(count)
	fmt.Printf("%c",b)
}
結果
[ `go run os.go` | done ]
	5
	[h e l l o]

   其他方式使用大同小異。

二:打開文件與關閉文件

package main

import (
	"fmt"
	"os"
)

func main() {
	path := "d:/abc.txt"
	file, err := os.Open(path)
	if err != nil {
		fmt.Printf("err=%v",err)
		return
	}
	fmt.Println(file)
	defer file.Close()
}
結果
[ `go run os.go` | done ]
	&{0xc000068780}

 由上結果可知,file為指針。

三:讀文件操作應用

①:文件讀取(適用於大小文件讀取)

package main

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

func main() {
	path := "d:/abc.txt"
	file, err := os.Open(path)
	if err != nil {
		fmt.Printf("err=%v",err)
		return
	}
     //創建緩存空間讀取文件 defer file.Close() reader := bufio.NewReader(file) for { str, err := reader.ReadString('\n') if err == io.EOF { break } fmt.Printf(str) } } 結果 [ `go run os.go` | done ] hello golang hello golang hello golang

 ②:一次性讀取(建議小文件使用)

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	path := "d:/abc.txt"
	//ioutil.ReadFile返回[]byte類型;ioutil.ReadFile()底層包含打開和關閉文件操作
	content, err := ioutil.ReadFile(path)
	if err != nil {
		fmt.Printf("讀寫出錯err=%v\r\n", err)
		return
	}
	fmt.Printf("%T\n",content)
	fmt.Println(string(content))

}
結果
[ `go run os.go` | done ]
	[]uint8
	hello golang
	hello golang
	hello golang
	hello golang

四:寫文件操作

①:os.OpenFile()介紹

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
name:需要打開的文件目錄名稱
flag
const (
    O_RDONLY int = syscall.O_RDONLY // 只讀模式打開文件
    O_WRONLY int = syscall.O_WRONLY // 只寫模式打開文件
    O_RDWR   int = syscall.O_RDWR   // 讀寫模式打開文件
    O_APPEND int = syscall.O_APPEND // 寫操作時將數據附加到文件尾部
    O_CREATE int = syscall.O_CREAT  // 如果不存在將創建一個新文件
    O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必須不存在
    O_SYNC   int = syscall.O_SYNC   // 打開文件用於同步I/O
    O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打開時清空文件
)
perm:權限控制
②:創建一個新文件,並寫入"hello golang"
package main

import (
	"fmt"
	"os"
	"bufio"
)

func main() {
	path := "d:/cw.txt"
	file, err := os.OpenFile(path, os.O_WRONLY | os.O_CREATE, 0666)
	if err != nil {
		fmt.Printf("err=%v", err)
		return
	}
	defer file.Close()

	str := "hello golang"

	//使用緩存方式寫入
	writer := bufio.NewWriter(file)

	count, w_err := writer.WriteString(str)
	//需要使用Flush()將寫入到writer緩存的數據真正寫入到cw.txt文件中
	writer.Flush()
	if w_err != nil {
		fmt.Println("寫入出錯")
	}else{
		fmt.Printf("寫入成功,共寫入字節:%v", count)
	}
}
結果
[ `go run os.go` | done ]
	寫入成功,共寫入字節:12

③:覆蓋原有內容

package main

import (
	"fmt"
	"os"
	"bufio"
)

func main() {
	path := "d:/cw.txt"
	file, err := os.OpenFile(path, os.O_WRONLY | os.O_TRUNC, 0666)
	if err != nil {
		fmt.Printf("err=%v", err)
		return
	}
	defer file.Close()

	str := "hello world!"

	//使用緩存方式寫入
	writer := bufio.NewWriter(file)

	count, w_err := writer.WriteString(str)
	//需要使用Flush()將寫入到writer緩存的數據真正寫入到cw.txt問卷1中
	writer.Flush()
	if w_err != nil {
		fmt.Println("寫入出錯")
	}else{
		fmt.Printf("寫入成功,共寫入字節:%v", count)
	}
}

 

cw.txt已由hello golang變為hello world!

備注:其實O_WRONLY默認就是覆蓋之前的內容寫入

④:文件內容最加

舉例略,將上O_TRUNK改為O_APPEND即可

其他應用不再舉例,結合①與②即可。

五:把一個文件內容寫入到另一個文件(兩個文件都必須存在)

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	path1 := "d:/cw.txt"
	path2 := "d:/abc.txt"
    
	content, err1 := ioutil.ReadFile(path1)
	if err1 != nil {
		fmt.Println(err1)
		return
	}
	err2 := ioutil.WriteFile(path2, content, 0666)
	if err2 != nil {
		fmt.Println(err2)
	}

}

 

六:判斷文件或文件夾是否存在

package main

import (
	"fmt"
	"os"
)

func main() {
	path1 := "d:/cw.txt"
	_, err1 := os.Stat(path1)
	if err1 != nil {
		fmt.Println("文件不存在")
		return
	}
	fmt.Println("文件存在")

}

 七:文件拷貝

package main

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

func main() {
	path1 := "d:/cw.txt"
	path2 := "d:/qwer.txt"
	src, _ := os.OpenFile(path1,os.O_RDONLY,0666)
	defer src.Close()
	dsc, _ := os.OpenFile(path2, os.O_RDWR,0666)
	defer dsc.Close()
	//written代表寫入的字節
	written, err := io.Copy(dsc, src)
	if err != nil {
		fmt.Println(err)
		return 
	}
	fmt.Println(written)
}
結果
[ `go run os.go` | done ]
	12

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM