Не удается извлечь ZIP-файл. Получение исключения недопустимых данных

У меня есть очень большой zip-файл, который содержит другие zip-файлы внутри него. Я хочу, чтобы моя программа на С# могла распознавать, что файл является zip-файлом, и если это zip-файл, то извлекать его в папку в том же месте, что и zip-файл. Мой код здесь:

private void Unzip(OpenFileDialog tvZipOpen)
{
    string zipFile = tvZipOpen.FileName; // file to unzip
    int i = zipFile.LastIndexOf(".zip");
    string targetDirectory = zipFile.Substring(0, i); // location to extract to
    using (ZipArchive zip = ZipFile.OpenRead(zipFile))
    {
        zip.ExtractToDirectory(targetDirectory);
    }

    tvZipOpen.InitialDirectory = targetDirectory;
    tvZipOpen.ShowDialog();
}

Я использую класс ZipFile из .NET 4.5 и вызываю этот метод здесь:

if (tvOpen.ShowDialog() == DialogResult.OK)
{
    while (tvOpen.FileName.ToLower().EndsWith(".zip"))
    {
        Unzip(tvOpen);
    }

    return tvOpen.FileNames;
}

Код отлично работает для извлечения первого zip-файла, но когда я пытаюсь извлечь второй zip-файл, я получаю InvalidDataException, в котором говорится, что заголовок локального файла поврежден. Однако я не думаю, что он поврежден, потому что я могу отлично открывать и извлекать zip-файлы в проводнике Windows. Я не уверен, имеет ли к этому какое-либо отношение тот факт, что это большой zip-файл с расширением zip64, но какова бы ни была проблема, почему у меня не возникает проблемы, когда я открываю и извлекаю в проводнике Windows и как мне исправить это? Любая помощь будет принята с благодарностью.


person user2954602    schedule 05.11.2013    source источник


Ответы (1)


c# не поддерживает расширение .zip64.

насколько велик ваш zip-файл, потому что, если он меньше 4 ГБ, переименуйте его в .zip, и он должен работать нормально, если он больше, см. это

http://dotnetzip.codeplex.com/

Чтобы изменить расширение файла

  1. Откройте проводник Windows и нажмите Alt + V.
  2. Затем перейдите к инструментам, а затем к параметрам папки и убедитесь, что флажок «Скрыть расширения для известных типов файлов» не установлен, и нажмите «Применить» и «ОК».
  3. затем просто переименуйте файл, чтобы удалить 64 из расширения, так что это просто .zip
  4. Затем нажмите «Да» в приглашении
  5. И тогда вы сможете открыть файл в своей программе

надеюсь это поможет

person 06needhamt    schedule 05.11.2013
comment
Я тоже об этом думал, но как же тогда я могу распаковать zip-файл в проводнике Windows? Разве Windows Explorer не использует .NET, и если у Windows Explorer есть решение, то оно должно быть, верно? - person user2954602; 05.11.2013
comment
потому что проводник Windows поддерживает .zip64, поэтому у него не будет проблем с открытием файла, но c # нет - person 06needhamt; 05.11.2013
comment
для решения см. ссылку в моем ответе - person 06needhamt; 05.11.2013
comment
Хорошо, большое спасибо за вашу помощь. как мне переименовать файл в .zip и удалить расширение .zip64? - person user2954602; 05.11.2013