go :复制文件内容到另一个文件

背景:
本文实验,从一个文件拷贝文件内容到另外一个文件
代码

package main

import (
	"fmt"
	"io"
	"os"
)

func copyFileContents(src, dst string) (err error) {
	in, err := os.Open(src)
	if err != nil {
		return
	}
	defer in.Close()
	out, err := os.Create(dst)
	if err != nil {
		return
	}
	defer func() {
		cerr := out.Close()
		if err == nil {
			err = cerr
		}
	}()
	if _, err = io.Copy(out, in); err != nil {
		return
	}
	err = out.Sync()
	return
}

func main() {
	err := copyFileContents("main.go", "test.test")
	if err != nil {
		panic(err)
	}

	fmt.Println("copy success!!!")
}

程序中,将 main.go 的文件内容拷贝到了 test.test 里面
运行代码之后可以查看 test.test内容

总结:
需要注意的是 sync函数
err = out.Sync()
复制完成之后需要判断一下文件状态,

// Sync commits the current contents of the file to stable storage.
// Typically, this means flushing the file system's in-memory copy
// of recently written data to disk.
func (f *File) Sync() error {
	if err := f.checkValid("sync"); err != nil {
		return err
	}
	if e := f.pfd.Fsync(); e != nil {
		return f.wrapErr("sync", e)
	}
	return nil
}

sync函数中会调用Fsync()将数据落盘

func (fd *FD) Fsync() error {
	if err := fd.incref(); err != nil {
		return err
	}
	defer fd.decref()

	_, e1 := fcntl(fd.Sysfd, syscall.F_FULLFSYNC, 0)
	return e1
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章