[英]Is a MemoryStream passed as a parameter reused or is a new one created?
[英]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.