每日一个 Golang Packages 06/07 os File Read wtite
2020/06/07
- ** 今日记忆 Package os.File**
package main
import (
"fmt"
"io"
"io/ioutil"
"os"
)
func main() {
// 打开文件 abcdefghij
fileName := "/Users/aliliin/go_code/file.txt"
file, err := os.Open(fileName)
if err != nil {
fmt.Println("error:", err)
}
// 关闭文件
defer file.Close()
// 读取数据
bs := make([]byte, 4, 4)
n := -1
// 从头开始读
n, err = file.Read(bs)
fmt.Println(string(bs[:n])) // abcd
// 指定位置开始读 num, err := file.ReadAt(bs, 2)
if err != nil {
fmt.Println("err:", err)
}
fmt.Println(string(bs[:num])) // cdef
// 写数据 // 打开文件 wtiteFileName := "/Users/aliliin/go_code/file.txt"
// os.O_CREATE 文件不存在创建文件
// os.O_WRONLY 文件具有写的权限
// os.O_APPEND 文件以追加的形式写入
wtiteFile, err := os.OpenFile(wtiteFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
if err != nil {
fmt.Println("error:", err)
}
// 关闭文件
defer wtiteFile.Close()
// 写数据 abcdefghijabcd
ws := []byte{97, 98, 99, 100} // abcd
wn, err := wtiteFile.Write(ws)
if err != nil {
fmt.Println(err)
}
fmt.Println(wn) // 写入的字符数 4
wtiteFile.WriteString("\n") // 换行写入
// 转换格式写 golang wn, err = wtiteFile.Write([]byte("golang"))
if err != nil {
fmt.Println(err)
}
fmt.Println(wn) // 写入的字符数 6
// 直接写入字符串 golangGolang wn, err = wtiteFile.WriteString("Golang")
if err != nil {
fmt.Println(err)
}
fmt.Println(wn) // 写入的字符数
// 拷贝文件 可以拷贝图片 srcFile := "/Users/aliliin/go_code/file.txt"
destFile := "file1.txt" // 拷贝后的文件名字
total1, err := CopyFile1(srcFile, destFile)
fmt.Println(total1, err)
total2, err := CopyFile2(srcFile, "file2.txt")
fmt.Println(total2, err)
total3, err := CopyFile3(srcFile, "file3.txt")
fmt.Println(total3, err)
/**
copy(dst,src) 为复制 src 全部到 dst中
copyN(dst,src,n(int64))为复制src中n个字节到dst
copyBuffer(dst,src,buf)为指定 一个buf缓存区,以这个大小完全复制
*/
}
/**
使用 ioutil 包拷贝文件
不适合大文件的读写,因为是一次性全部读取文件,然后写入新文件
*/
func CopyFile3(srcFile, destFile string) (int, error) {
bs, err := ioutil.ReadFile(srcFile)
if err != nil {
return 0, err
}
err = ioutil.WriteFile(destFile, bs, 0777)
if err != nil {
return 0, err
}
return len(bs), nil
}
/**
使用 io 包拷贝文件
*/
func CopyFile2(srcFile, destFile string) (int64, error) {
file, err := os.Open(srcFile)
if err != nil {
return 0, err
}
file2, err := os.OpenFile(destFile, os.O_CREATE|os.O_WRONLY, os.ModePerm)
if err != nil {
return 0, err
}
defer file.Close()
defer file2.Close()
return io.Copy(file2, file)
}
/**
打开文件之后再写入新文件 可以控制写入文件的大小
*/
func CopyFile1(srcFile, destFile string) (int, error) {
file, err := os.Open(srcFile)
if err != nil {
fmt.Println(err)
}
file2, err := os.OpenFile(destFile, os.O_CREATE|os.O_WRONLY, os.ModePerm)
if err != nil {
fmt.Println(err)
}
defer file.Close()
defer file2.Close()
// 读写 拷贝文件过大的话,就要修改这里的参数
bs := make([]byte, 1020, 1024)
n := -1 // 读取的数量
total := 0
for {
n, err = file.Read(bs)
if n == 0 || err == io.EOF {
fmt.Println("拷贝完毕")
break
} else if err != nil {
fmt.Println("error", err)
return total, err
}
total += n
file2.Write(bs[:n])
}
return total, nil
}
顺便佛系一下用 go 做做 leetcode 的练习题同步到了 GitHub 大家也可以看看。
一步一个脚印,稳扎稳打,重新出发!从基本的 Golang Packages 记忆开始,坚持 ing!
本作品采用《CC 协议》,转载必须注明作者和本文链接
你每天都写这么多吗?会不会忘记哦?有没什么好的学习方法传授下?