我目前遇到的问题是DotNetZip库无法正常工作。 我有一个包含不同节点的树视图:
每个节点都填充了文件夹和文件:
如名称所示,添加文件夹按钮可用于添加目录。 例如,"音频"文件夹被添加到树视图中,使用递归算法添加"音频"的所有子文件夹和文件。文件夹中。
下一步是创建一个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:
然后在程序目录中,如果ZIP应该是这样的:
所以结构相同。现在的问题是它最终做了类似的事情:
因此,zip.AddDirectory
- 方法不会添加音频 - 文件夹,只会添加其内容。
但我希望它还创建该文件夹,使其看起来像在树视图中。
你能告诉我怎么做吗?我只想让DotNetZip-lib创建该子文件夹。
我发现了这个:Add Folders to Root of Zip Using Ionic Zip Library
问题是,OP存在问题,这是我的目标。创建一个子文件夹! 谢谢;)
如果不清楚,请问!
答案 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);
}
}
}