2013-10-16 6 views
3

URL을 통해 zip 파일을 다운로드하려고합니다. 차라리 임시 파일 (괜찮습니다)을 저장하지 말고 메모리에 보관하십시오. 그리 크지는 않습니다. 예를 들어, 나는이 파일을 다운로드하려고하면이 코드를 사용하여HTTP 응답을 통해 파일 다운로드에서 DotNetZip ZipFile을 만들 수 없습니다.

http://phs.googlecode.com/files/Download%20File%20Test.zip

: 나는 수신하고 오류를 플래그

using Ionic.Zip; 
... 
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

if (response.ContentLength > 0) 
{ 
    using (MemoryStream zipms = new MemoryStream()) 
    { 
     int bytesRead; 
     byte[] buffer = new byte[32768]; 

     using (Stream stream = response.GetResponseStream()) 
     { 
      while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) 
       zipms.Write(buffer, 0, bytesRead); 

      ZipFile zip = ZipFile.Read(stream); // <--ERROR: "This stream does not support seek operations. " 
     } 

     using (ZipFile zip = ZipFile.Read(zipms)) // <--ERROR: "Could not read block - no data! (position 0x00000000) " 
     using (MemoryStream txtms = new MemoryStream()) 
     { 
      ZipEntry csentry= zip["Download File Test.cs"]; 
      csentry.Extract(txtms); 
      txtms.Position = 0; 
      using (StreamReader reader = new StreamReader(txtms)) 
      { 
       string csentry = reader.ReadToEnd(); 
      } 
     } 
    } 
} 
... 

참고. 첫 번째로는 System.Net.ConnectStream을 좋아하지 않습니다. 내가 그 라인을 주석 처리하고 그것이 두 번째 에러를 기록한 라인을 치도록 허용한다면, 그것은 MemoryStream을 좋아하지 않는다. 나는이 게시를 보았습니다 : https://stackoverflow.com/a/6377099/1324284하지만 다른 사람들이 WebClient를 시도 할 수 없도록 Read 메소드의 4 오버로드가 없다는 것에 대해 언급 한 것과 동일한 문제가 있습니다.

그러나 FileStream을 통해 모든 작업을 수행하여 임시 위치에 먼저 저장 한 다음 해당 임시 위치에서 ZipFile.Read를 가리키면 포함 된 모든 파일을 MemoryStream으로 추출하는 등 모든 작업이 수행됩니다.

도움 주셔서 감사합니다.

답변

3

MemoryStream을 으로 설정하고 읽으려면 Position을 0으로 설정해야합니다. 그렇지 않으면 현재 위치 (아무 것도없는 곳)에서 읽으려고합니다. 코드에 대한

:

ZipFile zip; 
using (Stream stream = response.GetResponseStream()) 
{ 
    while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) 
     zipms.Write(buffer, 0, bytesRead); 
    zipms.Flush(); 
    zipms.Position = 0; 
    zip = ZipFile.Read(zipms); 
} 
+0

감사 Halvard. 미안해, 내가 더 명확하게 wasnt하면, 나는 공간을 절약하기 위해 거기에 오류가있는 두 줄을 넣는다. 오류가있는 첫 번째 행을 제거하는 경우 오류가있는 다음 행을 찾을 때까지 계속 진행됩니다. 이전에 위치 재설정을 시도했지만 "이 스트림은 탐색 작업을 지원하지 않습니다."라는 오류를 표시합니다. 나는 당신이 제안했던 것처럼 내뿜기를 시도했다. 그러나 그것은 불행하게도 어떤 차이도 만들지 않았다. – Ernie

+0

@Ernie 당신의 요점을 놓치고있을 수도 있지만, 위의 코드를 시도해 볼 수 있습니까? (지금 막 내가 성취하고자하는 것을 분명히하기 위해 편집했습니다)? 이 코드 만 실행하면 어떤 오류가 발생합니까? – Halvard

+0

혼란을 드려 죄송합니다. 위의 코드를 입력하면 zipms.Position = 0에서 seek이 지원되지 않는다는 오류가 발생합니다. 추가 한 2 줄을 지우고 그 아래에 'zip = ...'이있는 줄을 제거하면 코드가 제대로 계속됩니다. 그런 다음 '(ZipFile zip = ZipFile.Read (zipms))'을 사용하여 오류가 발생합니다. 원래 게시에서 참조됩니다. 희망은 그것을 지 웁니다. – Ernie