public void LoadArchive(NexonArchive narFile) { Nodes.Clear(); if (narFile == null) { return; } TreeNode rootNode = new TreeNode("(NAR File)"); foreach (NexonArchiveFileEntry entry in narFile.FileEntries) { TreeNode node = FolderTreeView.FindOrCreateNodePath(rootNode, Path.GetDirectoryName(entry.Path)); if (!(node.Tag is IList <NexonArchiveFileEntry> nodeList)) { nodeList = new List <NexonArchiveFileEntry>(); node.Tag = nodeList; } nodeList.Add(entry); } rootNode.Expand(); Nodes.Add(rootNode); SelectedNode = rootNode; }
private static TreeNode FindOrCreateNodePath(TreeNode rootNode, string path) { if (path.Length == 0) { return(rootNode); } int startIndex = 0; while (path[startIndex] == '/' || path[startIndex] == '\\') { startIndex++; } int separatorIndex = path.IndexOfAny(new char[] { '/', '\\' }, startIndex); string name; if (separatorIndex >= 0) { name = path.Substring(startIndex, separatorIndex - startIndex); } else { name = path.Substring(startIndex); } TreeNode finalNode = null; foreach (object obj in rootNode.Nodes) { TreeNode node = (TreeNode)obj; if (string.Compare(node.Name, name, StringComparison.OrdinalIgnoreCase) == 0) { finalNode = node; break; } } if (finalNode == null) { finalNode = new TreeNode(name); finalNode.Name = name; rootNode.Nodes.Add(finalNode); } if (separatorIndex >= 0) { return(FolderTreeView.FindOrCreateNodePath(finalNode, path.Substring(separatorIndex + 1))); } return(finalNode); }