2015-05-21 6 views
6

मेरे पास गंतव्य स्ट्रिंग स्थान पर फ़ाइल (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 मैं कर सकता एक स्वीकृत जवाब यह है कि कठिन/नरम लिंक का उपयोग कर की सिफारिश और गर्भपात नहीं करता है तो फ़ाइल पहले से मौजूद है। एक प्रति golang करने के लिए

+1

'io.Copy' लिखित बाइट्स की संख्या देता है। आपको इसका निरीक्षण करना चाहिए, शायद यह मदद करेगा। –

+1

इसके अलावा, आपका कोड मेरे लिए काम करता है। क्या आप दिखा सकते हैं कि आप फ़ंक्शन का उपयोग कैसे करते हैं? –

+0

आप 'इन' में क्या प्रदान कर रहे हैं? क्या आप * किसी भी * त्रुटियों को देख रहे हैं? क्या खराब फ़ाइल पहले से मौजूद है (आप उस मामले में चुपचाप वापस आते हैं)? – JimB

उत्तर

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

इस कोड मेरे लिए काम करता है। io.Copy से वापसी मूल्य के साथ कॉपी किए गए बाइट्स की संख्या जांचें।

+0

बस स्पष्ट होने के लिए: किसी को हमेशा डिफर का उपयोग करने से पहले गलती की जांच करनी चाहिए। –

+1

सही। परिवर्तन किए गए – apoorvam

संबंधित मुद्दे