MemoryStream не читается при передаче в качестве параметра
Вчера у меня была странная проблема: когда я хотел передать 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
читать?
1 ответ
ZipFile.IsZipFile
изменяет позицию потока - ему нужно прочитать более одного байта данных. Вам нужно "перемотать" поток перед вызовом ImportArchive
:
stream.Position = 0;
Это не то, что может быть сделано автоматически - когда вы передаете какой-то метод потоку, обычно предполагается, что вы указываете на начало соответствующих данных. Это позволяет вам иметь разные "пакеты" данных в одном потоке, и это означает, что вы можете использовать потоки, которые не доступны для поиска.