一: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

