Запрет 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);