SharpZipLib - ZipException «System.ArgumentOutOfRangeException» - Почему я получаю это исключение? - PullRequest
5 голосов
/ 14 декабря 2010

Я использую SharpZipLib для распаковки файлов. Мой код прекрасно работает для всех zip-файлов, кроме zip-файла, который я сейчас извлекаю ...

Получил это исключение:

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: length

Исключение выдается на size = s.Read(data, 0, data.Length);

Вот мой код ...

 public static void UnzipFile(string sourcePath, string targetDirectory)
     {
        try
        {
            using (ZipInputStream s = new ZipInputStream(File.OpenRead(sourcePath)))
            {
                ZipEntry theEntry;
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    //string directoryName = Path.GetDirectoryName(theEntry.Name);
                    string fileName = Path.GetFileName(theEntry.Name);

                    if (targetDirectory.Length > 0)
                    {
                        Directory.CreateDirectory(targetDirectory);
                    }

                    if (fileName != String.Empty)
                    {
                        using (FileStream streamWriter = File.Create(targetDirectory + fileName))
                        {
                            int size = 2048;
                            byte[] data = new byte[2048];
                            while (true)
                            {
                                size = s.Read(data, 0, data.Length);
                                if (size > 0)
                                {
                                    streamWriter.Write(data, 0, size);
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw new Exception("Error unzipping file \"" + sourcePath + "\"", ex);
        }
    }

Ответы [ 3 ]

5 голосов
/ 14 декабря 2010

Похоже, ошибка для меня.К счастью, у вас есть доступ к коду, поэтому вы должны точно знать, где он идет не так.Я предлагаю вам создать отладочную версию SharpZipLib, разбить строку, которая выдает исключение, и взглянуть на то, что оно на самом деле тестирует.Осталось 2K данных.

(Я бы на самом деле не написал код так, как вы, но это другой вопрос. Я бы также переместил его в свой собственный служебный метод - акт копирования всех данных.из одного потока в другой встречается довольно часто. Нет необходимости привязывать его к zip.)

0 голосов
/ 14 декабря 2010

Измените свой код int size = 2048; на int size = data.Length;.Вы не возьмете исключение OutOfRange.

 using (FileStream streamWriter = File.Create(targetDirectory + fileName))
    {
       int size = data.Length;
       byte[] data = new byte[size];
       while (true)
       {
            size = s.Read(data, 0, data.Length);
            if (size > 0)
            {
                streamWriter.Write(data, 0, size);
            }
            else
            {
               break;
            }
       }
    }
0 голосов
/ 14 декабря 2010

Глядя на код, вы снова читаете тот же набор байтов (и продвигаете позицию).

size = s.Read(data, 0, data.Length);

Пример из здесь показывает, что 2-й аргумент должен быть движущейся позицией, а не фиксированным числом.

...