防止 DotNetZip 创建额外文件夹

问题描述 投票:0回答:2

我使用下面的代码片段通过

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应该有直接的源文件夹而不是嵌套的额外文件夹。

有人知道我如何更改该代码片段来做到这一点吗?

提前致谢。

c# zip directory dotnetzip ionic-zip
2个回答
1
投票

我根据 文档链接回答这个问题(查找带有 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);

0
投票

我知道这是一个非常老的问题并且已经接受了答案。我正在为那些仍在寻找最简单方法来防止在最终 zip 文件夹期间意外创建嵌套文件夹的人发帖。

而不是一次性添加整个目录。只需一一添加文件并传递空参数即可。

zip.AddFile(文件名, "");

最终代码如下所示。

string OutFileName = @"C:\Test\Out\final.zip";
string InDirectory = @"C:\Test\in";

using (var zip = new ZipFile())
{
    string[] filenames = Directory.GetFiles(InDirectory);
    foreach (var filename in filenames)
        zip.AddFile(filename, "");
    zip.Save(OutFileName);
    }
}

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.