DotNetZip: Как извлечь файлы, но игнорируя путь в zipfile? - PullRequest
11 голосов
/ 09 марта 2010

Попытка распаковать файлы в заданную папку, игнорируя путь в zipfile, но, похоже, пути нет.

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

Что мне не хватает?

код -

using (Ionic.Zip.ZipFile zf = Ionic.Zip.ZipFile.Read(zipPath))
{
    zf.ExtractAll(appPath);
}

Ответы [ 4 ]

23 голосов
/ 20 февраля 2012

Хотя вы не можете указать его для определенного вызова Extract() или ExtractAll(), класс ZipFile имеет поле FlattenFoldersOnExtract. При значении true все извлеченные файлы объединяются в одну папку:

var flattenFoldersOnExtract = zip.FlattenFoldersOnExtract;
zip.FlattenFoldersOnExtract = true;
zip.ExtractAll();
zip.FlattenFoldersOnExtract = flattenFoldersOnExtract;
13 голосов
/ 09 марта 2010

Вам нужно будет удалить часть каталога с именем файла перед распаковкой ...

using (var zf = Ionic.Zip.ZipFile.Read(zipPath))
{
    zf.ToList().ForEach(entry =>
    {
        entry.FileName = System.IO.Path.GetFileName(entry.FileName);
        entry.Extract(appPath);
    });
}
1 голос
/ 04 января 2012

Это не удастся, если есть 2 файла с одинаковыми именами файлов. Например Файлы \ additionalfiles \ FILE1.TXT Temp \ file1.txt

Первый файл будет переименован в file1.txt в zip-файле, и когда второй файл пытается переименоваться, выдается исключение, сообщающее, что элемент с таким же ключом уже существует

0 голосов
/ 29 августа 2016

Вы можете использовать перегрузку, которая принимает поток в качестве параметра.Таким образом, у вас есть полный контроль над путем, куда будут извлечены файлы.

Пример:

using (ZipFile zip = new ZipFile(ZipPath))
{
     foreach (ZipEntry e in zip)
     {
        string newPath = Path.Combine(FolderToExtractTo, e.FileName);

        if (e.IsDirectory)
        {
           Directory.CreateDirectory(newPath);
        }
        else
        {
          using (FileStream stream = new FileStream(newPath, FileMode.Create))
             e.Extract(stream);
        }
     }
}
...