2015-05-21 21 views
6

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.

+1

'io.Copy' trả về số byte được ghi. Bạn nên kiểm tra điều đó, có lẽ nó sẽ giúp ích. –

+1

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? –

+0

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

Trả lời

5
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) 
    } 
} 

Mã này làm việc cho tôi. Hãy kiểm tra số byte được sao chép với giá trị trả về từ io.Copy.

+0

Chỉ cần rõ ràng: Người ta phải luôn kiểm tra lỗi trước khi sử dụng hoãn. –

+1

Phải. Đã thực hiện thay đổi. – apoorvam

Các vấn đề liên quan