1.文件基础操作
package main
import(
"fmt"
"os"
)
func main(){
//打开文件
file , err := os.Open("d:/test.txt")
if err != nil {
fmt.Println("file错误信息:",err)
} else {
//输入内容 返回的是一个指针
fmt.Printf("file = %v",&file)
//结果:file = 0xc000006028
}
//关闭文件
err = file.Close()
if err != nil{
fmt.Println("file错误信息:",err)
}
}
2.读取文件内容并展示
1.带缓冲适用于读取较大文件使用
package main
import(
"fmt"
"os"
"bufio"
"io"
)
func main(){
//打开文件
file , err := os.Open("d:/test.txt")
if err != nil {
fmt.Println("file错误信息:",err)
}
//当函数退出时,及时关闭file
//使用 defer 内置函数 当函数退出时才会调用,要及时关闭否则会内存泄露
defer file.Close()
//创建一个 *Reader 是带缓存的 适用于读取较大文件
/*
const {
defaultBusSize = 4096 //默认的缓存为4096
}
*/
reader := bufio.NewReader(file)
//循环读取文件信息
for {
str,err := reader.ReadString('\n')// 读到一个换行就结束
if err == io.EOF { //io.EOF 表示文件的末尾
break
}
//输出内容
fmt.Print(str)
/*
学习golang语言中
学习到读取文件
还用一小部分就学习完成了
文件读取结束...
*/
}
fmt.Println("文件读取结束...")
}
2.一次性读取 适用于读取较小文件使用
package main
import(
"fmt"
"io/ioutil"
)
func main(){
//使用ioutil.ReadFile 一次性读取
file := "d:/test.txt"
content, err := ioutil.ReadFile(file)
if err != nil {
fmt.Printf("read file err=%v",err)
}
//把读取到的内容显示到终端
// fmt.Printf("%v",content)//返回的是[]byte类型 所以需要用string转换一下
fmt.Printf("%v",string(content))
/*
学习golang语言中
学习到读取文件
还用一小部分就学习完成了
*/
//代码中没有显示Open文件,所以也不需要显示Close文件
//因为 Open和Close文件已经封装到 ioutil.ReadFile 函数内部了
}
3.写入文件
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 // 如果可能,打开时清空文件 )
1.创建一个文件写入 hello,Gardon
package main
import(
"fmt"
"bufio"
"os"
)
func main(){
//1.创建一个新文件,写入内容 hello,Gardon
//1.打开文件 d:/adc.txt
filePath := "d:/adc.txt"
file , err := os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE ,0777) //参数3只要在linux系统下才会生效
if err != nil {
fmt .Printf("open file err=%v",err)
return
}
//及时关闭file句柄 避免文件泄露
defer file.Close()
//准备写入内容
str := "hello,Gardon\r\n"
//写入时,使用带缓存的 *Writer
writer := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
writer.WriteString(str)
}
//因为iwriter是带缓存,因此在调用WriterString方法时,其实内容是先写入
//到缓存的,所以需要调用Flush方法,将缓存的数据真正写入到文件中
writer.Flush()
}
结果
2.打开一个存在的文件 ,将原来的内容覆盖
os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE ,0777)
//将O_CREATE 改为 O_TRUNC即可 流程是一样的
3.打开一个存在的文件 ,在原来的内容追加新的内容
file , err := os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE ,0777)
//将O_CREATE 改为 O_APPEND即可 流程是一样的
4.打开一个存在的文件 ,将原来的内容读出显示在终端,请求追加内容
package main
import(
"fmt"
"bufio"
"os"
"io"
)
func main(){
//1.创建一个新文件,写入内容 hello,Gardon
//1.打开文件 d:/adc.txt
filePath := "d:/adc.txt"
file , err := os.OpenFile(filePath,os.O_RDWR | os.O_APPEND ,0777) //参数3只要在linux系统下才会生效
if err != nil {
fmt .Printf("open file err=%v",err)
return
}
//及时关闭file句柄 避免文件泄露
defer file.Close()
//先读取原来的内容并在终端显示
reader := bufio.NewReader(file)
//循环读取文件信息
for {
str,err := reader.ReadString('\n')// 读到一个换行就结束
if err == io.EOF { //io.EOF 表示文件的末尾
break
}
//输出内容
fmt.Print(str)
}
//准备写入内容
str := "hello,Gardon\r\n"
//写入时,使用带缓存的 *Writer
writer := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
writer.WriteString(str)
}
//因为iwriter是带缓存,因此在调用WriterString方法时,其实内容是先写入
//到缓存的,所以需要调用Flush方法,将缓存的数据真正写入到文件中
writer.Flush()
}
案例:将A文件内容 导入到B文件
方式1:
package main
import(
"fmt"
"io/ioutil"
"bufio"
"os"
)
func main(){
//将a.txt 文件内容 导入 b.txt文件中
//打开a.txt文件
url := "d:/a.txt"
content, err := ioutil.ReadFile(url)
if err != nil {
fmt.Printf("read file err=%v",err)
}
//输出结果
// fmt.Printf("%v",string(content))
//获取结果
str1 := string(content)
filePath := "d:/b.txt"
file , err := os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE ,0777) //参数3只要在linux系统下才会生效
if err != nil {
fmt .Printf("open file err=%v",err)
return
}
//及时关闭file句柄 避免文件泄露
defer file.Close()
//写入时,使用带缓存的 *Writer
writer := bufio.NewWriter(file)
writer.WriteString(str1)
//因为iwriter是带缓存,因此在调用WriterString方法时,其实内容是先写入
//到缓存的,所以需要调用Flush方法,将缓存的数据真正写入到文件中
writer.Flush()
}
方式2:
package main
import(
"fmt"
"io/ioutil"
)
func main(){
//将a.txt 文件内容 导入 b.txt文件中
//打开a.txt文件
file1Path := "d:/a.txt"
file2Path := "d:/b.txt"
data, err := ioutil.ReadFile(file1Path)
if err != nil {
fmt.Printf("read file err=%v",err)
}
//输出结果
// fmt.Printf("%v",string(data))
err = ioutil.WriteFile(file2Path,data,0777)
if err != nil {
fmt.Printf("write file err=%v",err)
}
}
5.文件是否存在
package main
import(
"fmt"
"os"
)
//判断文件是否存在, true 存在 false 不存在
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,nil
}
func main(){
file1Path := "d:/adc.txt"
a,e := PathExists(file1Path)
fmt.Printf("a=%v,e=%v",a,e)
}
6.将图片/视频/音乐 cp到指定文件
package main
import(
"fmt"
"os"
"io"
"bufio"
)
//编写一个方法封装 dstFileName 目标目录 srcFileName 原文件
func CopyFile(dstFileName string,srcFileName string) (written int64,err error){
//获取原文件的Reader
srcFile , err := os.Open(srcFileName)
if err != nil{
fmt.Printf("open file err=%v\n",err)
}
reader := bufio.NewReader(srcFile)
//关闭资源
defer srcFile.Close()
//打开 dstFileName 不存在目录就创建
dstFile , err := os.OpenFile(dstFileName,os.O_WRONLY | os.O_CREATE,0777)
if err != nil {
fmt.Printf("open file err=%v",err)
}
//通过dstFile,获取到Writer
writer := bufio.NewWriter(dstFile)
defer dstFile.Close()
return io.Copy(writer,reader)
}
func main(){
srcFileName := "d:/aaaaa.jpg"
dstFileName := "d:/go/aaaaa.jpg"
_,err := CopyFile(dstFileName,srcFileName)
if err == nil {
fmt.Println("copy成功")
} else {
fmt.Printf("copy失败 err=%v",err)
}
}