public D2pDirectory TryGetDirectory(string directory) { string[] directoriesName = directory.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries); if (directoriesName.Length == 0) { return(null); } D2pDirectory current = null; m_rootDirectories.TryGetValue(directoriesName[0], out current); if (current == null) { return(null); } foreach (string dir in directoriesName.Skip(1)) { if (!current.HasDirectory(dir)) { return(null); } current = current.TryGetDirectory(dir); } return(current); }
public D2pDirectory[] GetDirectoriesTree(string directory) { var result = new List <D2pDirectory>(); string[] directoriesName = directory.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries); if (directoriesName.Length == 0) { return(new D2pDirectory[0]); } D2pDirectory current = null; m_rootDirectories.TryGetValue(directoriesName[0], out current); if (current == null) { return(new D2pDirectory[0]); } result.Add(current); foreach (string dir in directoriesName.Skip(1)) { if (!current.HasDirectory(dir)) { return(result.ToArray()); } current = current.TryGetDirectory(dir); result.Add(current); } return(result.ToArray()); }
private void InternalAddDirectories(D2pEntry entry) { string[] directories = entry.GetDirectoriesName(); if (directories.Length == 0) { return; } D2pDirectory current = null; if (!m_rootDirectories.ContainsKey(directories[0])) { m_rootDirectories.Add(directories[0], current = new D2pDirectory(this, directories[0])); } else { current = m_rootDirectories[directories[0]]; } if (directories.Length == 1) { current.Entries.Add(entry); } for (int i = 1; i < directories.Length; i++) { string directory = directories[i]; var next = current.TryGetDirectory(directory); if (next == null) { var dir = new D2pDirectory(this, directory) { Parent = current }; current.Directories.Add(directory, dir); current = dir; } else { current = next; } if (i == directories.Length - 1) { current.Entries.Add(entry); } } entry.Directory = current; }
private void InternalRemoveDirectories(D2pEntry entry) { D2pDirectory current = entry.Directory; while (current != null) { current.Entries.Remove(entry); if (current.Parent != null && current.Entries.Count == 0) { current.Parent.Directories.Remove(current.Name); } else if (current.IsRoot && current.Entries.Count == 0) { m_rootDirectories.Remove(current.Name); } current = current.Parent; } }
public void ExtractDirectory(string directoryName, string destination) { if (!HasDirectory(directoryName)) { throw new InvalidOperationException(string.Format("Directory {0} does not exist", directoryName)); } D2pDirectory directory = TryGetDirectory(directoryName); if (!Directory.Exists(Path.Combine(destination, directory.FullName))) { Directory.CreateDirectory(Path.Combine(destination, directory.FullName)); } foreach (D2pEntry entry in directory.Entries) { ExtractFile(entry.FullFileName, Path.Combine(destination, entry.FullFileName)); } foreach (var pDirectory in directory.Directories) { ExtractDirectory(pDirectory.Value.FullName, destination); } }