private void FillDirectory(TreeNode parent, IEnumerable <INode> Nodes, IArchiveFile archiveFile) { foreach (var node in Nodes) { if (node is IDirectoryContainer) { var folder = new ArchiveFolderNodeWrapper(node.Name, archiveFile, this); parent.Nodes.Add(folder); if (((IDirectoryContainer)node).Nodes != null) { FillDirectory(folder, ((IDirectoryContainer)node).Nodes, archiveFile); } } else if (node is ArchiveFileInfo) { ArchiveFileWrapper wrapperFile = new ArchiveFileWrapper(node.Name, (ArchiveFileInfo)node, this); wrapperFile.Name = node.Name; parent.Nodes.Add(wrapperFile); AddFileNode(wrapperFile); } } }
private void FillTreeNodes(TreeNode root, IArchiveFile archiveFile) { Nodes.Clear(); var rootText = root.Text; var rootTextLength = rootText.Length; var nodeFiles = archiveFile.Files; if (archiveFile is IDirectoryContainer) { FillDirectory(root, ((IDirectoryContainer)archiveFile).Nodes, archiveFile); } else //Else create directories by filename paths { foreach (var node in archiveFile.Files) { if (!node.CanLoadFile) { continue; } if (!((IFileFormat)archiveFile).IFileInfo.InArchive && File.Exists(((IFileFormat)archiveFile).FilePath)) { node.SourceFile = ((IFileFormat)archiveFile).FilePath; } string nodeString = node.FileName; var roots = nodeString.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); // The initial parent is the root node var parentNode = root; var sb = new System.Text.StringBuilder(rootText, nodeString.Length + rootTextLength); for (int rootIndex = 0; rootIndex < roots.Length; rootIndex++) { // Build the node name var parentName = roots[rootIndex]; sb.Append("/"); sb.Append(parentName); var nodeName = sb.ToString(); // Search for the node var index = parentNode.Nodes.IndexOfKey(nodeName); if (index == -1) { // Node was not found, add it var folder = new ArchiveFolderNodeWrapper(parentName, archiveFile, this); if (rootIndex == roots.Length - 1) { ArchiveFileWrapper wrapperFile = new ArchiveFileWrapper(parentName, node, this); wrapperFile.Name = nodeName; parentNode.Nodes.Add(wrapperFile); parentNode = wrapperFile; AddFileNode(wrapperFile); } else { folder.Name = nodeName; parentNode.Nodes.Add(folder); parentNode = folder; } } else { // Node was found, set that as parent and continue parentNode = parentNode.Nodes[index]; } } } } }