簡體   English   中英

作為參數傳遞時,MemoryStream不可讀

[英]MemoryStream not readable when passed as parameter

昨天我遇到了一個奇怪的問題:當我想將zip文件作為byte[]傳遞並讀取它時,我得到了Ionic.Zip.ZipExpception

無法將其讀取為ZipFile

public string Import(byte[] file)
{
    try
    {
        var stream = new MemoryStream(file);
        if (ZipFile.IsZipFile(stream))
        {
            ImportArchive(stream);
        } else {
            ...
        }
    ...
}

private void ImportArchive(MemoryStream stream)
{
    var zip = ZipFile.Read(stream); //--> ZipException thrown
    ...
}

現在,如果我將byte[]作為參數而不是MemoryStream傳遞,則一切正常:

public string Import(byte[] file)
{
    try
    {                
        if (ZipFile.IsZipFile(new MemoryStream(file), true))
        {
            ImportArchive(file);
        } else {
            ...
        }
    ...
}

private void ImportArchive(byte[] file)
{
    var fileStream = new MemoryStream(file);
    var zip = ZipFile.Read(fileStream); //--> no exception!
    ...
}

這兩個版本之間有何區別? 為什么不能讀取傳遞的MemoryStream的第一個版本?

ZipFile.IsZipFile更改流的位置-它需要讀取多個字節的數據。 您需要在調用ImportArchive之前“倒帶”流:

stream.Position = 0;

這不是可以自動完成的事情-當您將某種方法傳遞給流時,通常會假定您指向相關數據的開頭。 這使您可以在一個流中具有不同的數據“數據包”,這意味着您可以使用不可搜索的流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM