示例#1
0
        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);
                }
            }
        }
示例#2
0
        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];
                        }
                    }
                }
            }
        }