防止 DotNetZip 创建额外的文件夹
Prevent DotNetZip to create extra folder
我已经使用下面的代码片段通过 Ionic.zip
制作了 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
是外部文件夹,这意味着 Export_1.zip 应该有直接源文件夹而不是嵌套的额外文件夹。
有人知道我如何更改该片段代码来做到这一点吗?
提前致谢。
我是根据 documentation link 回答这个问题的(查找带有 2 个参数的 AddDirectory):
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);
我已经使用下面的代码片段通过 Ionic.zip
制作了 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
是外部文件夹,这意味着 Export_1.zip 应该有直接源文件夹而不是嵌套的额外文件夹。
有人知道我如何更改该片段代码来做到这一点吗?
提前致谢。
我是根据 documentation link 回答这个问题的(查找带有 2 个参数的 AddDirectory):
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);