Запрет DotNetZip для создания дополнительной папки

Я использовал приведенный ниже фрагмент кода, чтобы сделать папку zip Ionic.zip:

string lastFolder = packageSpec.FolderPath.Split('\\')[packageSpec.FolderPath.Split('\\').Length - 1];
string zipRoot = packageSpec.FolderPath + "\\Zip" + lastFolder;
string fileName = zipRoot + "\\" + lastFolder + ".zip";
Logging.Log(LoggingMode.Prompt, "Spliting to zip part...");
if (!Directory.Exists(zipRoot))
     Directory.CreateDirectory(zipRoot);
ZipFile zip = new ZipFile();
zip.AddDirectory(packageSpec.FolderPath, zipRoot);
zip.MaxOutputSegmentSize = 200 * 1024 * 1024; // 200 MB segments
zip.Save(fileName);

он прекрасно работает для создания нескольких частей zip, но создает неожиданную вложенную папку, как показано ниже: если переменные:

FolderPath = C:\MSR\Temp\Export_1

zipRoot = C:\MSR\Temp\Export_1\ZipExport_1

fileName= C:\MSR\Temp\Export_1\ZipExport_1\Export_1.zip

Мой источник похож на изображение ниже:

введите описание изображения здесь

1 - это моя исходная папка с персоналом для архивации

2- это папка zip будет содержать 1 zip.AddDirectory(packageSpec.FolderPath, zipRoot);

Но я заканчиваю с:

введите описание изображения здесь

так что эти папки MSR->Temp->Export_1->ZipExport_1->ZipExport1 являются extera, что означает, что Export_1.zip должен иметь непосредственно исходную папку, а не вложенные дополнительные папки.

Кто-нибудь знает, как я могу изменить этот фрагмент кода, чтобы сделать это?

заранее спасибо.

1 ответ

Решение

Я отвечаю на это по ссылке на документацию (ищите AddDirectory с 2 параметрами):

using (ZipFile zip = new ZipFile())
{
    // files in the filesystem like MyDocuments\ProjectX\File1.txt , will be stored in the zip archive as  backup\File1.txt
    zip.AddDirectory(@"MyDocuments\ProjectX", "backup");

    // files in the filesystem like MyMusic\Santana\OyeComoVa.mp3, will be stored in the zip archive as  tunes\Santana\OyeComoVa.mp3
    zip.AddDirectory("MyMusic", "tunes");

    // The Readme.txt file in the filesystem will be stored in the zip archive as documents\Readme.txt
    zip.AddDirectory("Readme.txt", "documents");

    zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G") ;
    zip.Save(ZipFileToCreate);
}

Это означает, что ваш код должен выглядеть так:

using(ZipFile zip = new ZipFile())
{
    zip.AddDirectory(packageSpec.FolderPath, lastFolder);
    zip.Save(fileName);
}

Результат:

Export_1.zip          (archive)
|-> Export_1          (folder)
    |-> Files&Folders (data)
    |-> Files&Folders (data)
    |-> Files&Folders (data)

НОТА:

Важно использовать using синтаксис, так как в конце концов вы не уничтожаете ZIP-файл, что может привести к некоторым жертвам при реальном запуске программы (например, утечка памяти). Пожалуйста, проверьте эту статью на MSDN -> https://msdn.microsoft.com/en-gb/library/system.idisposable(v=vs.110).aspx?cs-lang=csharp

РЕДАКТИРОВАТЬ:

Поскольку я не был уверен, каков ожидаемый результат, я не смог предоставить то, что Вы хотите. Но если вам не нужна папка, почему вы передаете второй параметр? Решение должно быть:

zip.AddDirectory(packageSpec.FolderPath);
Другие вопросы по тегам