阅读zip条目并将其保存在字符串中

问题描述:

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

好的。对不起,如此密集。我意识到我正在推翻这一点。我改变了功能做到这一点:

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

它工作得很好!甚至不必担心编码...