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

Aliliin發表於2020-06-07

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 協議》,轉載必須註明作者和本文連結
微信搜尋:上帝喜愛笨人

相關文章