2016-06-22 77 views
0

Ack。我試圖在zip文件存檔中打開一個特定條目,並將內容存儲在一個字符串中,而不是將其保存到文件中。我無法爲每個客戶端使用磁盤空間。閱讀zip條目並將其保存在字符串中

這是我有:

string scontents = ""; 
    byte[] abbuffer = null; 
    MemoryStream oms = new MemoryStream(); 
    try 
    { 
    //get the file contents 
    ozipentry.Open().CopyTo(oms); 
    int length = (int)oms.Length; // get file length 
    abbuffer = new byte[length];   // create buffer 
    int icount;       // actual number of bytes read 
    int isum = 0;       // total number of bytes read 

    // read until Read method returns 0 (end of the stream has been reached) 
    while ((icount = oms.Read(abbuffer, isum, length - isum)) > 0) 
    { 
     isum += icount; // sum is a buffer offset for next reading 
    } 
    scontents = BytesToString(abbuffer); <----abbuffer is filled with Ascii 0 
    } 
    finally 
    { 
    oms.Close(); 
    } 

變量abbuffer應該認爲流的內容,但所有它認爲是一串ASCII零的,我猜意味着它沒看過(或複製)流!但我沒有收到任何錯誤消息或任何內容。有人能告訴我如何使這個工作?

我已經在堆棧和網絡上到處尋找,並且沒有人會專門爲ASP.NET 4.5 ZipArchive庫回答此問題。我不能使用任何其他圖書館,所以如果你提供一個答案,雖然這是一個教育,但在這種情況下根本不會幫助我。非常感謝您的幫助!

還有一件事。 'ozipentry'是ZipArchiveEntry類型,是ZipArchive Entries數組中的一個元素。 (即ozipentry = oziparchive.Entries [i])

糟糕。還有一件事!不包括函數'BytesToString',因爲它是不相關的。在函數被調用之前,abbuffer數組已經被0填充了。

+0

我不明白將入口流複製到MemoryStream的意義,但如果您必須這樣做,那麼在嘗試設置'Memorystream.Position'屬性爲0之前從中讀取。爲什麼不根據入口流創建一個'StreamReader'並使用它來獲取所需的字符串? – TnTinMn

+0

是的,我也意識到了。直到我發佈了一個答案之前,沒有看到您的評論...我所做的是,我想,你基本上在說什麼。客戶端有人告訴我使用內存流,而且像一個白癡,我說,'是'!而不是想,嗯,爲什麼? – aaava

回答

0

好的。對不起,如此密集。我意識到我正在推翻這一點。我改變了功能做到這一點:

osr = new StreamReader(ozipentry.Open(), Encoding.Default); 
    scontents = osr.ReadToEnd(); 

它工作得很好!甚至不必擔心編碼...

相關問題