2016-10-28 9 views
1

압축을 푼 tar.gz의 내용을 go lang의 단일 파일로 복사하려고합니다. 파일 안에는 텍스트 만 있습니다.추출 된 tar.gz를 하나의 파일에 복사

다음은 현재 코드입니다.

f, err := os.Open(fullpath) 
if err != nil { 
    log.Panicf("Can not open file %s: %v", fullpath, err) 
    return "" 
} 
defer f.Close() 
reader, err := gzip.NewReader(f) 
if err != nil{ 
    log.Panicf("Cannot read gzip archive %v", err); 
    return "" 
} 
defer reader.Close() 
tar_reader := tar.NewReader(reader) 
var files []io.Reader 
for{ 
    header, err := tar_reader.Next() 
    if err == io.EOF { 
     break 
    } else if err != nil { 
     log.Panicf("Cannot read file inside tarball %v", err); 
     return 0, err 
    } else { 
     log.Println("Parsing file : ", header.Name) 
     files = append(files, tar_reader) 
    } 
} 
reader = io.MultiReader(files...) 
writer, err := os.Create(target) 
if err != nil { 
    log.Panicf("Cannot write unarchived file %v", err); 
    return 0, err 
} 
defer writer.Close() 

result,err := io.Copy(writer, reader) 
if(err != nil) { 
    log.Panicf("Cannot write unarchived file %v", err); 
} 
return result,err 

위의 코드에 오류가 없는데도 파일을 읽을 수 없습니다. 출력에는 데이터가 없습니다. 내가 잘못 가고있는 곳을 지적 해주세요.

답변

2

동일한 tar.Readerfiles 슬라이스에 계속 추가하고 있습니다. 헤더를 읽은 후에는 아카이브에서 파일을 읽어야합니다. 그 시점에서 파일을 복사하십시오.

copied := 0 
for { 
    header, err := tar_reader.Next() 
    if err == io.EOF { 
     break 
    } else if err != nil { 
     log.Fatalf("Cannot read file inside tarball %v", err) 
    } 

    if !(header.Typeflag == tar.TypeReg || header.Typeflag == tar.TypeRegA) { 
     continue 
    } 


    n, err = io.Copy(writer, tar_reader) 
    if err != nil { 
     log.Fatalf("Cannot write unarchived file %v", err) 
    } 
    copied += n 
} 
return copied, nil 
+0

고마워요.하지만 모든 tar_readers를 단일 멀티ireader에 추가하고 싶습니다. 그게 가능하니? – PiKaY

+0

@PiKaY : 아니요, tar.Reader가 하나뿐이기 때문입니다. MultiReader를 사용하려면 모든 파일을 개별 버퍼에 복사하여 별도의 io.Reader를 만들어야합니다. 이것은 당신이 원하는 것을 정확히하고 있지만 여분의 복사본은 없습니다. – JimB

+0

감사합니다. @JimB 현재 코드 구성으로 인해 약간의 제약이있었습니다. 나는 이것에 맞을 수 있다고 생각한다. :) 답변 감사합니다 – PiKaY