2014-04-24 4 views
2
package main 

    import (
     "fmt" 
     "io" 
     "io/ioutil" 
     "os" 
    ) 

    func main() { 
     file, err := os.Open("HelloWorld") 
     if nil != err { 
      fmt.Println(err) 
     } 
     defer file.Close() 

     fileTo, err := os.Create("fileTo") 
     if nil != err { 
      fmt.Println(err) 
     } 
     defer file.Close() 

     _, err = io.Copy(fileTo, file) 
     if nil != err { 
      fmt.Println(err) 
     } 

     fileByteOne, err := ioutil.ReadAll(file) 
     if nil != err { 
      fmt.Println(err) 
     } 

     fmt.Println(fileByteOne) 
    } 

io.Copy를 (삭제, 출력은 다음과 같습니다io.Copy() 파일의 내용을 지울 것) 리더의 콘텐츠

[] 
SRC에서

복사 (DST 작가, SRC 리더) 사본 DST에 src 내용을 지울 것입니다. 지우기를 피하는 방법이 있습니까?

답변

4

io.Copy(fileTo, file) 그것은하지 않습니다 파일 내용

삭제됩니다. 그러나 읽음 위치를 EOF으로 이동하면 다음 ioutil.ReadAll()이 ... EOF에서 시작됨을 의미합니다.

ioutil.ReadAll() 앞에 'file'을 닫고 다시 열 수 있습니다.

그런데 두 개의 defer file.Close() 인스턴스가 있습니다. 두 번째 인스턴스는 defer fileTo.Close()이어야합니다.
PeterSOanswer과 같이 SectionReader.Seek()을 사용하여 간단하게 재설정 할 수 있습니다.

_, err = file.Seek(0, os.SEEK_SET) 

은 또한 GoByExamples Reading Files에 예시되어있다 :

에는 내장 되감기,하지만 Seek(0, 0)이를 수행 없습니다.

시크로 파일의 시작 파일의 끝에서

const SEEK_SET int = 0 // seek relative to the origin of the file 
2

리셋 (os.SEEK_SET0로, os constants에 정의되어있다). 예를 들어.

package main 

import (
    "fmt" 
    "io" 
    "io/ioutil" 
    "os" 
) 

func main() { 
    file, err := os.Open("HelloWorld") 
    if err != nil { 
     fmt.Println(err) 
    } 
    defer file.Close() 

    fileTo, err := os.Create("fileTo") 
    if err != nil { 
     fmt.Println(err) 
    } 
    defer fileTo.Close() 

    _, err = io.Copy(fileTo, file) 
    if err != nil { 
     fmt.Println(err) 
    } 

    _, err = file.Seek(0, os.SEEK_SET) // start of file 
    if err != nil { 
     fmt.Println(err) 
    } 
    fileByteOne, err := ioutil.ReadAll(file) 
    if err != nil { 
     fmt.Println(err) 
    } 

    fmt.Println(fileByteOne) 
} 

출력 :

[72 101 108 108 111 44 32 87 111 114 108 100 33 10] 
+0

내가 탐색() 호출을 놓쳤다. +1. 나는 "Go By Example"페이지에 대한 링크와 함께 내 자신의 대답으로 그것을 참조했다. – VonC

관련 문제