【发布时间】: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#