gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:14:36 27 4
gpt4 key购买 nike

我有以下功能可以将文件(实际上是 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com