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 協議》,轉載必須註明作者和本文連結