ShaHam11 Ответов: 1

Распаковка файлов с помощью zipinputstream


Привет Команда,

Ниже приведен код для распаковки zip-папки . Я получаю исключения арифметического переполнения, Да, я понимаю, что это потому, что байт может обрабатывать максимум 255 байт.
public static void DecompressArchive(StringBuilder newPath, ZipInputStream zipIn)
        {
            ZipEntry entry;
            while ((entry = zipIn.GetNextEntry()) != null)
            {
                if (entry.Name.EndsWith("/"))
                {
                    Directory.CreateDirectory(String.Format("{0}{1}", newPath, entry.Name.Replace(@"/", @"\")));
                }
                else
                {
                    FileStream streamWriter = File.Create(String.Format("{0}{1}", newPath, entry.Name.Replace(@"/", @"\")));
                    long size = entry.Size;
                    Byte[] data = new Byte[size];
                    while (true)
                    {
                        size = zipIn.Read(data, 0, data.Length);
                        if (size > 0) streamWriter.Write(data, 0, (int)size);
                        else break;
                    }
                    streamWriter.Close();
                }


Я понимаю, что байтовый массив не может занимать больше 255 байт. Как мне справиться с этой ситуацией, когда мой размер составляет > 255.

Что я уже пробовал:

Попробовал преобразовать байт в int.. Однако streamWriter.Метод Write() принимает первые параметры байта массива

Mehdi Gholam

Откуда взялся этот код?

ShaHam11

Я получил его от google из блога

Parveen Siwach

Я попробовал это сделать, и все работает нормально. Можете ли вы поделиться Zip-файлом, который хотите распаковать?

охраняемых недействительными btnUnzip_Click(объект отправителя, EventArgs в электронной)
{
То StringBuilder newpath не новое окно инструментов();
новая тропа.Добавить(@"D:\Test\");
строка zipPathAndFile = @"D:\Data\User_Data.zip";
ZipInputStream zipIn = новый ZipInputStream(файл.OpenRead(zipPathAndFile));
Декомпрессархив(newPath, zipIn);
}

общественная статический недействительным DecompressArchive(newpath не то StringBuilder, ZipInputStream zipIn)
{
Вход ZipEntry;
while ((запись = zipIn.GetNextEntry ())! = null)
{
если (entry.Name.Метода endswith("/"))
{
Каталог.CreateDirectory(Строка.Формат("{0}{1}", новый путь, entry.Name.Заменять(@"/", @"\")));
}
ещё
{
FileStream streamWriter = файл.Create (String.Формат("{0}{1}", новый путь, entry.Name.Заменять(@"/", @"\")));
длинный размер = запись.Размер;
Byte[] data = новый байт[размер];
в то время как (правда)
{
размер = zipIn.Читают(данные, 0, данные.Длина);
if (size > 0) streamWriter.Write (data, 0, (int)size);
иначе сломается;
}
модулю записи StreamWriter.Закрывать();
}
}
}

ShaHam11

это работает, если размер файла меньше, есть заархивированная папка, которая составляет около 800 МБ и более

1 Ответов

Рейтинг:
2

Parveen Siwach

Привет,

Попробуйте этот код, это решит вашу проблему. Я проверил это, чтобы распаковать файл размером 900 МБ.

protected void btnUnzip_Click(object sender, EventArgs e)
        {
            StringBuilder newPath = new StringBuilder();
            newPath.Append(@"D:\Test\");
            string zipPathAndFile = @"F:\EnglishBook.zip";
            ZipInputStream zipIn = new ZipInputStream(File.OpenRead(zipPathAndFile));
            DecompressArchive(newPath, zipIn);
        }

        public static void DecompressArchive(StringBuilder newPath, ZipInputStream zipIn)
        {
            ZipEntry entry;
            while ((entry = zipIn.GetNextEntry()) != null)
            {
                if (entry.Name.EndsWith("/"))
                {
                    Directory.CreateDirectory(String.Format("{0}{1}", newPath, entry.Name.Replace(@"/", @"\")));
                }
                else
                {
                    FileStream streamWriter = File.Create(String.Format("{0}{1}", newPath, entry.Name.Replace(@"/", @"\")));
                    //long size = entry.Size;
                    int size = 1024 * 10;
                    Byte[] data = new Byte[size];
                    while (true)
                    {
                        size = zipIn.Read(data, 0, data.Length);
                        if (size > 0)
                        {
                            streamWriter.Write(data, 0, (int)size);
                        }
                        else break;
                    }
                    streamWriter.Close();
                }
            }
        }


Примечание: единственное, что я изменил, - это размер куска.

//long size = entry.Size;
int size = 1024 * 10;


Спасибо,