2009-03-20 5 views
0

인터넷에서 다음 코드를 가져와 http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz과 같은 gzip 파일의 압축을 푸는 데 사용하고 있지만 실행하면 예외가 발생합니다. 번호가 일치하지 않습니다..NET에서 gzip 아카이브를 압축 해제 할 때의 문제

public byte[] Download(string pUrl) { 
    WebClient wc = new WebClient(); 
    byte[] bytes = wc.DownloadData(pUrl); 
    return UnGzip(bytes, 0); 
} 

private static byte[] UnGzip(byte[] data, int start) { 
    int size = BitConverter.ToInt32(data, data.Length - 4); 
    byte[] uncompressedData = new byte[size]; 
    MemoryStream memStream = new MemoryStream(data, start, (data.Length - start)); 
    memStream.Position = 0; 
    GZipStream gzStream = new GZipStream(memStream, CompressionMode.Decompress); 

    try { 
     gzStream.Read(uncompressedData, 0, size); 
    } catch (Exception gzError) { 
     throw; 
    } 

    gzStream.Close(); 
    return uncompressedData; 
} 

이 문제의 원인이되는 코드에는 어떤 것이 있습니까?

+0

바이트 [] 데이터 배열을 가져 오는 코드를 표시 할 수 있습니까? – JaredPar

+0

요청한 것을 추가했습니다. – Ash

답변

3

문제는 질문에 지정한 URL이 실제로 gzip 파일을 제공하지 않는다는 것입니다. 브라우저를 사용하여 미러를 선택하는 페이지로 이동합니다.

당신이 일시적으로 Download 방법을 사용하여 변경하는 경우 :

string text = wc.DownloadString(pUrl); 
Console.WriteLine(text); 

당신이 거울 선택을위한 모든 HTML을 볼 수 있습니다.

실제 gz 파일 인 URL을 사용하는 경우 http://wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz 다음 잘 작동합니다.

-1

.NET은 tar 형식을 지원하지 않습니다. gzip은 단순히 바이트 압축기입니다. Tar는 컨테이너 형식입니다.

ZIPRAR과 같은 형식은이 두 단계를 결합하지만 스트리밍 압축에는 적합하지 않습니다.

정확하게 기억한다면 SharpZipLib은 tar를 지원합니다.

0

저는 DotNetZip을 사용했으며 일부는 .zip 파일로 성공했습니다. 문서에 따르면 GZip에서도 작동합니다. 이 남자의 도서관에 시험해 볼 수도 있습니다.

+0

DotNetZip은 내장 GZipStream 클래스와 동일한 방식으로 GZIP을 수행합니다. DotNetZip을 사용하면 네임 스페이스를 제외하고 OP에서 제공하는 코드가 실제로 변경되지 않습니다. DotNetZip을 사용할 때의 주요 이점은 압축시 더욱 효과적이라는 것입니다. 감압에 이점이 없습니다. – Cheeso