DotNetZip-lib - 不仅要在目录中添加文件,还要包含整个目录

时间:2014-07-07 19:33:15

标签: c#

我目前遇到的问题是DotNetZip库无法正常工作。 我有一个包含不同节点的树视图:

enter image description here

每个节点都填充了文件夹和文件:

enter image description here

如名称所示,添加文件夹按钮可用于添加目录。 例如,"音频"文件夹被添加到树视图中,使用递归算法添加"音频"的所有子文件夹和文件。文件夹中。

下一步是创建一个zip文件,其中包含treeview的所有元素。 要创建zip文件,我使用以下代码:

private void InitializeArchiveContents(int nodeIndex, string currentDirectory)
    {
        foreach (TreeNode node in explorerTreeView1.Nodes[nodeIndex].Nodes)
        {
            FileAttributes attr = File.GetAttributes(node.Tag.ToString());
            if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
            {
                zip.AddDirectory(node.Tag.ToString(), currentDirectory);
                currentDirectory += String.Format("{0}/", Path.GetDirectoryName(node.Text));
            }
            else
            {
                zip.AddFile(node.Tag.ToString(), currentDirectory);
            }
        }
    }

问题:不幸的是,上面代码创建的zip文件不包含"音频"夹。

以下是上述代码的简短说明:

它采用当前节点索引(例如0表示上面的 program -node),然后检查它是文件还是目录。我将文件的整个路径添加到TreeNodes的Tag - 属性中。 currentDirectory代表存档中的当前文件夹。因此,在课程开始时,我将一个名称(AddDirectoryByName)的文件夹添加到zip中。然后将其命名为 Program ,在zip中的此文件夹中,应填写TreeView的程序节点中的所有内容。 因此,每当有新目录到达时,我都会更新currentDirectory以使ZIP中的路径保持最新,以确保文件最终位于正确的文件夹中。

因此,如果路径是目录,则会将目录添加到存档中,如果是文件,则会添加该文件。

更清楚:

的TreeView:

  • 程序目录
    • 音频
      • File1.wav
      • File2.mp3

然后在程序目录中,如果ZIP应该是这样的:

  • 计划
    • 音频
      • File1.wav
      • File2.mp3

所以结构相同。现在的问题是它最终做了类似的事情:

  • 计划
    • File1.wav
    • File2.mp3

因此,zip.AddDirectory - 方法不会添加音频 - 文件夹,只会添加其内容。 但我希望它还创建该文件夹,使其看起来像在树视图中。

你能告诉我怎么做吗?我只想让DotNetZip-lib创建该子文件夹。

我发现了这个:Add Folders to Root of Zip Using Ionic Zip Library

问题是,OP存在问题,这是我的目标。创建一个子文件夹! 谢谢;)

如果不清楚,请问!

1 个答案:

答案 0 :(得分:1)

您需要更改递归逻辑。而且您不需要使用AddDirectory添加包含整个内容的目录,因为某些文件可以从Treeview中删除。您可以直接从Treeview添加要归档的文件,而不是这个。

InitializeArchiveContents(explorerTreeView1[nodeIndex], "Program/")

...

private void InitializeArchiveContents(TreeNode node, string currentDirectory)
{
    foreach (var node in node.Nodes)
    {
        var attr = File.GetAttributes(node.Tag.ToString());
        if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
        {
            var tmpDir = string.Format("{0}/{1}", currentDirectory, node.Text);
            zip.AddDirectoryByName(tmpDir);
            InitializeArchiveContents(node, tmpDir);
        }
        else
        {
            zip.AddFile(node.Tag.ToString(), currentDirectory);
        }
    }
}