文件操作
文件操作
基本操作
https://studygolang.com/pkgdoc go语言文档库
package main
import (
"fmt"
"os"
)
func main() {
//打开文件
file, err := os.Open("C:/Users/小子/Desktop/面向对象/文件操作/test.txt")
if err != nil {
fmt.Println("open file err= ",err)
}
//打开文件看内容,就是一个指针*file
fmt.Printf("file=%v",file)
//关闭文件
err =file.Close()
if err != nil{
fmt.Println("close file err=",err)
}
}
读取文件内容
文件大使用这个方式
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
//打开文件
file, err := os.Open("C:/Users/小子/Desktop/面向对象/文件操作/test.txt")
if err != nil {
fmt.Println("open file err= ",err)
}
//当函数退出的时候,要及时关闭file否则会内存泄漏
defer file.Close()
//const (defaultBufsize=4096)//默认的缓冲区为4096
reader := bufio.NewReader(file)
//循环读取文件内容
for{
str,_ := reader.ReadString('\n')//读到一行就结束
if err ==io.EOF{
//io.EOF表示读到文件的末尾
break
}
fmt.Print(str)
}
}
文件小使用这个方式
package main
import (
"fmt"
"io/ioutil"
)
func main() {
file := "C:/Users/小子/Desktop/面向对象/文件操作/test.txt"
content,err := ioutil.ReadFile(file)
if err !=nil{
fmt.Println("read err=",err)
}
fmt.Println(string(content))
}
写文件
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
//创建一个新文件.写入内容
filePath :="C:/Users/小子/Desktop/面向对象/文件操作/test.txt"
file, err := os.OpenFile(filePath,os.O_WRONLY|os.O_CREATE,0666)
if err != nil{
fmt.Println("err file = ",err)
return
}
defer file.Close()
//写内容
str :="hello world!"
//写入时,使用带缓存的*writer
writer := bufio.NewWriter(file)
for i:=0;i<5;i++{
writer.WriteString(str)
}
//因为witer是带缓存,因此调用WriteString时内容先写到缓存中,所以调用flush方法,真正写入到文件中,否则文件中会丢失数据
writer.Flush()
}
-
打开一个存在的文件,将原来的内容覆盖成新的内容
func main() { //创建一个新文件.写入内容 filePath :="C:/Users/小子/Desktop/面向对象/文件操作/test.txt" file, err := os.OpenFile(filePath,os.O_WRONLY|os.O_TRUNC,0666) if err != nil{ fmt.Println("err file = ",err) return } defer file.Close() //写内容 str :="hello world!我是zc\n" //写入时,使用带缓存的*writer writer := bufio.NewWriter(file) for i:=0;i<10;i++{ writer.WriteString(str) } //因为witer是带缓存,因此调用WriteString时内容先写到缓存中,所以调用flush方法,真正写入到文件中,否则文件中会丢失数据 writer.Flush() } //O_TRUNC覆盖原来的内容
-
打开文件,在原来的内容上追加内容
os.O_APPEND
-
打开文件,将原来的内容显示出来,并追加东西
func main() { //创建一个新文件.写入内容 filePath :="C:/Users/小子/Desktop/面向对象/文件操作/test.txt" file, err := os.OpenFile(filePath,os.O_RDWR|os.O_APPEND,0666) if err != nil{ fmt.Println("err file = ",err) return } defer file.Close() //先将文件读取出来,显示在终端 reader := bufio.NewReader(file) for { str, err :=reader.ReadString('\n') if err ==io.EOF{ break } fmt.Println(str) } //写内容 str :="1732984729384\n" //写入时,使用带缓存的*writer writer := bufio.NewWriter(file) for i:=0;i<10;i++{ writer.WriteString(str) } //因为witer是带缓存,因此调用WriteString时内容先写到缓存中,所以调用flush方法,真正写入到文件中,否则文件中会丢失数据 writer.Flush()
-
将一个文件的内容,写入到另一个文件中
package main import ( "fmt" "io/ioutil" ) func main() { file1Path := "C:/Users/小子/Desktop/面向对象/文件操作/test.txt" file2Path := "C:/Users/小子/Desktop/面向对象/文件操作/1.txt" data,err := ioutil.ReadFile(file1Path) if err !=nil{ fmt.Println(err) return } err = ioutil.WriteFile(file2Path,data,0666) if err !=nil{ fmt.Println(err) } }
-
判断文件是否存在
func PathExists(path string)(bool,error){ _,err:=os.Stat(path) if err !=nil{ return true,nil } if os.IsNotExist(err){ return false,nil } return false,err }
-
拷贝文件(图片/视频)
package main import ( "fmt" "os" "io" "bufio" ) //自己编写一个函数,接收两个文件路径 srcFileName dstFileName func CopyFile(dstFileName string, srcFileName string) (written int64, err error) { srcFile, err := os.Open(srcFileName) if err != nil { fmt.Printf("open file err=%v\n", err) } defer srcFile.Close() //通过srcfile ,获取到 Reader reader := bufio.NewReader(srcFile) //打开dstFileName dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE, 0666) if err != nil { fmt.Printf("open file err=%v\n", err) return } //通过dstFile, 获取到 Writer writer := bufio.NewWriter(dstFile) defer dstFile.Close() return io.Copy(writer, reader) } func main() { //将d:/flower.jpg 文件拷贝到 e:/abc.jpg //调用CopyFile 完成文件拷贝 srcFile := "d:/flower.jpg" dstFile := "e:/abc.jpg" _, err := CopyFile(dstFile, srcFile) if err == nil { fmt.Printf("拷贝完成\n") } else { fmt.Printf("拷贝错误 err=%v\n", err) } }