2010-06-18 7 views
7

gzip으로 압축 된 파일을 다운로드하고 압축을 푸는 코드가 있습니다. 문제는 전체 파일의 압축을 풀 수 없으며 첫 번째 4096 바이트 만 읽은 다음 약 500 개만 읽습니다.GZipStream 전체 파일을 읽을 수 없습니다.

Byte[] buffer = new Byte[4096]; 
int count = 0; 
FileStream fileInput = new FileStream("input.gzip", FileMode.Open, FileAccess.Read, FileShare.Read); 
FileStream fileOutput = new FileStream("output.dat", FileMode.Create, FileAccess.Write, FileShare.None); 
GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress, true); 

// Read from gzip steam 
while ((count = gzipStream.Read(buffer, 0, buffer.Length)) > 0) 
{ 
    // Write to output file 
    fileOutput.Write(buffer, 0, count); 
} 

// Close the streams 
... 

다운로드 한 파일을 확인했습니다. 압축시 13MB이고 하나의 XML 파일을 포함합니다. XML 파일의 압축을 수동으로 풀었습니다. 내용이 모두 있습니다. 그러나이 코드를 사용하면 XML 파일의 시작 부분 만 출력됩니다.

누구에게 이런 일이 일어날 수있는 아이디어가 있습니까?

+0

를 사용할 수 있습니다. 그러나, 나는 작업 코드를 살펴 봤는데, 결국'using '블록으로 싸여진 것 이외의 것으로 보인다. –

+3

Flush() 메서드를 호출하고 있습니까? – n535

+0

Flush()로 시도했지만 도움이되지 않았습니다. – Edgar

답변

1

나는 GZipStream 대신 압축 풀기를 수행하기 위해 gzip 실행 파일을 사용했다. 어떤 이유로 파일을 처리 할 수 ​​없지만 실행 파일은 처리 할 수 ​​있습니다.

+0

최종 버전을 게시 할 수 있습니까? gzip 실행 파일을 사용하는 방법을 정확하게보고 싶습니다. – ManInMoon

+0

죄송합니다. 더 이상 코드에 액세스 할 수 없습니다. Process 클래스를 사용하여 gzip 실행 파일을 호출했습니다. 도움이 될 수도 있습니다 : http://www.dotnetperls.com/7-zip – Edgar

4

편집

열어 GZipStream 떠나지 않을보십시오 :

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress, 
                     false); 

또는

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress); 
+0

예, CopyTo()를 시도했습니다. 결과는 같습니다. 나는 왜 그것이 그것보다 더 읽을 수 없는지 전혀 모른다. – Edgar

+0

문 사용을 시도했습니다. 변경 없음. – Edgar

+0

GZipStream을 열어 두지 않으려 고 시도했습니다. 변경 없음. – Edgar

0

당신이 fileOutputClose 또는 Flush를 호출을? (아니면 그냥 using로 감싸는 것이 좋습니다. 그렇지 않으면 프로그램이 종료 될 때 파일이 디스크로 플러시되지 않을 수 있습니다.

+0

읽기가 완료되면 3 개의 스트림이 모두 닫힙니다. 문제는 데이터가 출력 파일에 올바르게 기록되지 않지만 Read()가 전체 입력 파일을 읽지 않는다는 것입니다. 뭔가 방해가 될 수 있습니까? 그것은 정지하기 전에 매번 정확한 바이트 수를 읽습니다. 이는 흥미 롭습니다. – Edgar

+0

처음 읽은 후'count'의 값은 무엇입니까? –

+0

첫 번째 읽은 후 4096, 두 번째 읽기 532, 다음 중지됩니다. – Edgar

1

나에게도 똑같은 일이 일어났습니다. 내 경우에는 최대 6 줄까지만 읽은 다음 파일 끝에 도달했습니다. 그래서 확장이 gz이지만 GZipStream에서 지원하지 않는 다른 알고리즘에 의해 압축되었다는 것을 알게되었습니다. 그래서 SevenZipSharp 라이브러리를 사용했고 효과가있었습니다. 이것은 내 코드

입니다 당신은 내가 압축 해제 루틴을 작성할 때 나는이 문제를 점점 기억 SevenZipSharp 라이브러리를

using (var input = File.OpenRead(lstFiles[0])) 
{ 
    using (var ds = new SevenZipExtractor(input)) 
    { 
     //ds.ExtractionFinished += DsOnExtractionFinished; 

     var mem = new MemoryStream(); 
     ds.ExtractFile(0, mem); 

     using (var sr = new StreamReader(mem)) 
     { 
      var iCount = 0; 
      String line; 
      mem.Position = 0; 
      while ((line = sr.ReadLine()) != null && iCount < 100) 
      { 
       iCount++; 
       LstOutput.Items.Add(line); 
      } 

     } 
    } 
} 
관련 문제