2014-10-10 89 views
2

我在C#中使用DotNetZip從流解壓縮如下:使用DotNetZip失敗,「流不支持查找操作」

WebClient client = new WebClient(); 
Stream fs = client.OpenRead(url); 

但是獲得

public static void unzipFromStream(Stream stream, string outdir) 
{ //omit try catch block 
    using (ZipFile zip = ZipFile.Read(stream)){ 
     foreach (ZipEntry e in zip){ 
      e.Extract(outdir, ExtractExistingFileAction.OverwriteSilently); 
     } 
    } 
} 

流,我以下例外

exception during extracting zip from stream System.NotSupportedException: This stream does not support seek operations. 
at System.Net.ConnectStream.get_Position() 
at Ionic.Zip.ZipFile.Read(Stream zipStream, TextWriter statusMessageWriter, Encoding encoding, EventHandler`1 readProgress) 

在服務器端(ASP.NET MVC 4),返回FilePathResultFileStreamResult都導致此異常。

我應該在客戶端獲得不同的流嗎?或者如何讓服務器返回一個「可搜索」流?謝謝!

回答

5

您必須將數據下載到文件或內存中,然後創建FileStreamMemoryStream或其他支持查找的流類型。例如:

WebClient client = new WebClient(); 
client.DownloadFile(url, filename); 
using (var fs = File.OpenRead(filename)) 
{ 
    unzipFromStream(fs, outdir); 
} 
File.Delete(filename); 

或者,如果數據能保存到內存中:

byte[] data = client.DownloadData(url); 
using (var fs = new MemoryStream(data)) 
{ 
    unzipFromStream(fs, outdir); 
} 
+0

謝謝,吉姆!數據大小是否僅限於內存?還是通過在C#中的contrains? – totoro 2014-10-10 05:13:50

+1

@green'MemoryStream'有一些大小限制(最大爲「Int32.MaxValue」字節,但在使用OutOfMemoryExceptions之前可能會失敗)。 'FileStream'只受硬盤大小的限制。 – 2014-10-10 07:46:56

相關問題