Tôi có chức năng sau để sao chép tệp (io.Reader thực sự) đến vị trí chuỗi đích. Tuy nhiên, có vẻ như chỉ một phần của tệp thực sự được sao chép dẫn đến tệp bị hỏng. Tôi đang làm gì sai?Làm cách nào để sao chép tệp trong Go?
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
}
Tôi đang sử dụng phương thức này với phương thức filepath.Walk(dir, visit)
để xử lý tệp trong thư mục.
// 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)
}
}
hiện nay closest question tôi có thể có một câu trả lời chấp nhận rằng khuyến cáo sử dụng cứng/liên kết mềm và không hủy bỏ nếu tập tin đã tồn tại.
'io.Copy' trả về số byte được ghi. Bạn nên kiểm tra điều đó, có lẽ nó sẽ giúp ích. –
Ngoài ra, mã của bạn hoạt động cho tôi. Bạn có thể cho thấy cách bạn sử dụng chức năng này không? –
Bạn đang cung cấp gì cho 'in'? Bạn có thấy * bất kỳ lỗi nào không? Hiện các tập tin xấu đã tồn tại (bạn trở lại âm thầm trong trường hợp đó)? – JimB