每日一个 Golang Packages 06/07 os File Read wtite

2020/06/07

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 协议》,转载必须注明作者和本文链接
微信搜索:上帝喜爱笨人
讨论数量: 1

你每天都写这么多吗?会不会忘记哦?有没什么好的学习方法传授下?

3年前 评论
Aliliin (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!