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;

Это не то, что может быть сделано автоматически - когда вы передаете какой-то метод потоку, обычно предполагается, что вы указываете на начало соответствующих данных. Это позволяет вам иметь разные "пакеты" данных в одном потоке, и это означает, что вы можете использовать потоки, которые не доступны для поиска.

Другие вопросы по тегам