【问题标题】:DotNetZip-lib - Do not only add the files in a directory, but include the whole directoryDotNetZip-lib - 不要只添加目录中的文件,而是包括整个目录
【发布时间】:2014-07-07 19:33:14
【问题描述】:

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

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

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

下一步是创建一个包含树视图所有元素的 zip 文件。 要创建 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 文件不包含“Audio”文件夹。

下面是对上面代码的简短解释:

它获取当前节点索引(例如 0 代表上面的 program-节点),然后检查它是文件还是目录。我将文件的整个路径添加到 TreeNodes 的Tag-property。 currentDirectory 代表存档中的当前文件夹。所以在我的课程开始时,我在 zip 中添加了一个按名称 (AddDirectoryByName) 的文件夹。然后它被称为 Program,并且在 zip 内的这个文件夹中,应填写 TreeView 的 program 节点中的所有内容。 因此,每次出现新目录时,我都会更新 currentDirectory 以使 ZIP 中的路径保持最新,以确保文件最终位于正确的文件夹中。

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

为了更清楚:

树视图:

  • 程序目录
    • 音频
      • File1.wav
      • 文件2.mp3

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

  • 程序
    • 音频
      • File1.wav
      • 文件2.mp3

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

  • 程序
    • File1.wav
    • 文件2.mp3

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

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

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

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

如果有不清楚的地方,问!

【问题讨论】:

  • 我认为currentDirectory 有问题。当您第一次调用时,zip.AddDirectory(node.Tag.ToString(), currentDirectory); 文件被添加到根文件夹,因为currentDirectory 是空的(或根文件夹)。您可以通过调试器检查current Directory 的值吗?这条线对我来说毫无意义currentDirectory += String.Format("{0}/", Path.GetDirectoryName(node.Text));
  • 是的,一开始就是根文件夹。明天我会用断点检查。最后一行用于使存档中的当前目录保持最新,以便将文件粘贴到正确的目录中。
  • 如果程序目录下有其他文件夹(例如视频),最后的currentDirectory将是Audio/Video/
  • 嗯,对。所以,我明天会检查一下,如果你能帮我找到一个好的解决方案,那就太好了。
  • @shfire 因此,当调用函数“InitializeArchiveContents”时,currentDirectory 参数当然是根目录。它的开头值为“Program/”。

标签: c#


【解决方案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);
        }
    }
}

【讨论】:

  • 好的,谢谢!我允许自己尝试代码,它在标记的行中抛出了一个异常:trade-programming.de/pixelkram/yczdeivgwn.png 它说:已经添加了具有相同键的元素。有什么想法可以解决这个问题吗?
  • tmpDir 的值是多少?您是在创建新存档还是更新现有存档?
  • 所以,开头的值是“Program/”。我正在创建一个新档案。
  • tmpDir 桅杆是string.Format("{0}/{1}", currentDirectory, node.Text)
  • 好吧,我用断点调试,发现问题是有一个“Path.GetDirectoryName”,我认为是你编辑的。在你的帮助下,我做到了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 2011-04-08
  • 2017-03-30
相关资源
最近更新 更多