2011-06-16 49 views
4

我想下載並提取C#中的zip文件,特別是DotNetZip。提取內存中的zip文件與C#失敗DotNetZip

當我運行這段代碼...

 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(reportUrl); 
     HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse(); 
     Stream stream = response.GetResponseStream(); 
     MemoryStream ms = new MemoryStream(); 

     stream.CopyTo(ms); 
     ms.Seek(0, 0); 
     ZipInputStream zip = new ZipInputStream(ms); 
     zip.Seek(0, 0); 

     ZipEntry e = zip.GetNextEntry(); 
     string s = e.FileName; 

     MemoryStream ms2 = new MemoryStream(); 
     e.Extract(ms2); 

後的提取方法執行,我得到...

 $exception {"Object reference not set to an instance of an object."} System.Exception {System.NullReferenceException} 

有什麼想法?謝謝!

Here's what the object looks like before the method runs

+1

我的直接想法是InputStream爲空 – Ell 2011-06-16 18:48:47

+0

你試過使用不同的memorystream實例嗎? – 2011-06-16 18:49:39

+1

「解壓縮方法執行後」是什麼意思?拋出異常之前它是否正確執行? Extract後的下一行代碼是什麼? – 2011-06-16 18:51:46

回答

3

這很難說,爲什麼你的代碼不能正常工作。我會通過簡化它,並確保我妥善處理所有可支配的資源,如流開始:

class Program 
{ 
    static void Main() 
    { 
     var url = "http://downloads.sourceforge.net/project/junit/junit/3.8.1/junit3.8.1.zip"; 
     using (var client = new WebClient()) 
     using (var zip = ZipFile.Read(client.DownloadData(url))) 
     { 
      foreach (var entry in zip) 
      { 
       entry.Extract("."); 
      }   
     } 
    } 
} 

確保您籤的文檔,使用DotNetZip庫many useful examples

+0

嘿,感謝Darin的回答!但是,這並不適合我(.NET 4.0,最新版本的DotNetZip)。我不想屠殺你的答案通過依賴我的不存在的C#使它工作...從Byte.Array(DownloadData返回值)到IO.Stream,Read命令所需的最佳方式是什麼? – 2011-06-16 19:06:59

+0

@Charles Offenbacher ,你得到了什麼錯誤?因爲我剛剛在我的Win7 x64 VS2010 .NET 4.0上測試了這段代碼,它的工作非常好。 – 2011-06-16 19:07:30

+0

ZipFile.Read似乎只接受一個文件名字符串或Stream for me ...怪異的我'在VS2010 .NET 4.0 Win7的x64太....嗯... 1秒 – 2011-06-16 19:08:43

相關問題