file - 你如何在 Go 中复制文件?

标签 file go copy

我有以下功能可以将文件(实际上是 io.Reader)复制到目标字符串位置。但是,似乎只有部分文件被实际复制,导致文件损坏。我做错了什么?

func CopyFile(in io.Reader, dst string) (err error) {

    // Does file already exist? Skip
    if _, err := os.Stat(dst); err == nil {
        return nil
    }

    err = nil

    out, err := os.Create(dst)
    if err != nil {
        fmt.Println("Error creating file", err)
        return
    }

    defer func() {
        cerr := out.Close()
        if err == nil {
            err = cerr
        }
    }()


    var bytes int64
    if bytes, err = io.Copy(out, in); err != nil {
        fmt.Println("io.Copy error")
        return
    }
    fmt.Println(bytes)

    err = out.Sync()
    return
}

我将其与 filepath.Walk(dir, visit) 方法结合使用来处理目录中的文件。

// Process each matching file on our walk down the filesystem
func visit(path string, f os.FileInfo, err error) error {

    if reader, err := os.Open(path); err == nil {
        defer reader.Close()

        // http://golang.org/pkg/os/#FileInfo
        statinfo, err := reader.Stat()

        if err != nil {
            fmt.Println(err)
            return nil
        }

        fmt.Println()
        fmt.Println(statinfo.Size())

        // Directory exists and is writable
        err = CopyFile(reader, "/tmp/foo/"+f.Name())

        if err != nil {
            fmt.Println(err)
        }

    } else {
        fmt.Println("Impossible to open the file:", err)
    }
}

当前closest question我可以接受建议使用硬/软链接(soft link)的答案,并且如果文件已经存在则不会中止。

最佳答案

package main

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

func main() {
    srcFile, err := os.Open("test.txt")
    check(err)
    defer srcFile.Close()

    destFile, err := os.Create("test_copy.txt") // creates if file doesn't exist
    check(err)
    defer destFile.Close()

    _, err = io.Copy(destFile, srcFile) // check first var for number of bytes copied
    check(err)

    err = destFile.Sync()
    check(err)
}

func check(err error) {
    if err != nil {
        fmt.Println("Error : %s", err.Error())
        os.Exit(1)
    }
}

这段代码对我有用。使用 io.Copy 的返回值检查复制的字节数。

关于file - 你如何在 Go 中复制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30376921/

相关文章:

go - 将未更改的小写 header 添加到 golang http 请求

ruby - 在 Go (golang) 中编写一个 Ruby 扩展

c++ - 复制构造函数和赋值运算符都被调用

c++ - 如何将 map 中的 copy_if 复制到 vector ?

list - 如何在 kotlin 中克隆或复制列表

file - 如何读取 elixir mix 项目的配置文件

javascript - 通过jquery.form插件上传文件

c# - 为什么 FileStream.Position 以 1024 的倍数递增?

go - 如何使用基准时间值(value)

c# - 加载一定数量的文件而不是扫描并加载目录中的所有文件