/// <summary> /// Recursivly creates a directory tree by traversing PDIR records. Adds FILE records to the current directory /// tree node. Recursivly traverses PDIR records and adds them to the current directory tree node's children. /// </summary> /// <param name="directoryEntry">Directory Entry</param> /// <param name="root">Parent node</param> private void BuildDirectoryTree(DirectoryRecord.DirectoryEntry directoryEntry, DirectoryTreeNode root) { if (!RecordOffsets.ContainsKey(directoryEntry.Offset)) { return; // TODO throw error } if (RecordOffsets[directoryEntry.Offset] is DirectoryRecord) { // This offset is a directory, add it as a child of root and process all of it's entries var currentDirectory = RecordOffsets[directoryEntry.Offset] as DirectoryRecord; _directories.Add(currentDirectory); var child = new DirectoryTreeNode { Name = currentDirectory.Name, Parent = root, Children = new List <DirectoryTreeNode>(), Files = new List <FileRecord>(), Record = currentDirectory, }; root.Children.Add(child); foreach (var entry in currentDirectory.Entries) { BuildDirectoryTree(entry, child); } } else if (RecordOffsets[directoryEntry.Offset] is FileRecord) { var currentFile = RecordOffsets[directoryEntry.Offset] as FileRecord; _files.Add(currentFile); currentFile.ContainingDirectory = root; root.Files.Add(currentFile); } }
private static void BuildDirectoryTree(long fileOffset, DirectoryTreeNode root, Dictionary <long, BaseRecord> recordOffsets) { if (!recordOffsets.ContainsKey(fileOffset)) { return; } if (recordOffsets[fileOffset] is DirectoryRecord) { DirectoryRecord directoryRecord = recordOffsets[fileOffset] as DirectoryRecord; DirectoryTreeNode directoryTreeNode = new DirectoryTreeNode { Name = directoryRecord.Name, Parent = root, Children = new List <DirectoryTreeNode>(), Files = new List <FileRecord>(), Record = directoryRecord }; root.Children.Add(directoryTreeNode); DirectoryRecord.DirectoryEntry[] entries = directoryRecord.Entries; for (int i = 0; i < entries.Length; i++) { DirectoryRecord.DirectoryEntry directoryEntry = entries[i]; DirectoryTreeMaker.BuildDirectoryTree(directoryEntry.Offset, directoryTreeNode, recordOffsets); } return; } if (recordOffsets[fileOffset] is FileRecord) { FileRecord fileRecord = recordOffsets[fileOffset] as FileRecord; fileRecord.ContainingDirectory = root; root.Files.Add(fileRecord); } }
/// <summary> /// Recursivly creates a directory tree by traversing PDIR records. Adds FILE records to the current directory /// tree node. Recursivly traverses PDIR records and adds them to the current directory tree node's children. /// </summary> /// <param name="directoryEntry">Directory Entry</param> /// <param name="root">Parent node</param> /// <param name="recordOffsets">Map of record offsets and headers to create directory tree from</param> private static void BuildDirectoryTree(DirectoryRecord.DirectoryEntry directoryEntry, DirectoryTreeNode root, IReadOnlyDictionary <long, BaseRecord> recordOffsets) { if (!recordOffsets.ContainsKey(directoryEntry.Offset)) { return; } var record = recordOffsets[directoryEntry.Offset] as DirectoryRecord; if (record != null) { // This offset is a directory, add it as a child of root and process all of it's entries DirectoryRecord currentDirectory = record; DirectoryTreeNode child = new DirectoryTreeNode { Name = currentDirectory.Name, Parent = root, Children = new List <DirectoryTreeNode>(), Files = new List <FileRecord>(), Record = currentDirectory, }; root.Children.Add(child); foreach (var entry in currentDirectory.Entries) { BuildDirectoryTree(entry, child, recordOffsets); } } else { var file = recordOffsets[directoryEntry.Offset] as FileRecord; if (file == null) { return; } FileRecord currentFile = file; currentFile.ContainingDirectory = root; root.Files.Add(currentFile); } }
/// <summary> /// Recursivly creates a directory tree by traversing PDIR records. Adds FILE records to the current directory /// tree node. Recursivly traverses PDIR records and adds them to the current directory tree node's children. /// </summary> /// <param name="directoryEntry">Directory Entry</param> /// <param name="root">Parent node</param> /// <param name="recordOffsets">Map of record offsets and headers to create directory tree from</param> private static void BuildDirectoryTree(DirectoryRecord.DirectoryEntry directoryEntry, DirectoryTreeNode root, Dictionary <long, BaseRecord> recordOffsets) { if (!recordOffsets.ContainsKey(directoryEntry.Offset)) { return; } if (recordOffsets[directoryEntry.Offset] is DirectoryRecord) { // This offset is a directory, add it as a child of root and process all of it's entries DirectoryRecord currentDirectory = recordOffsets[directoryEntry.Offset] as DirectoryRecord; DirectoryTreeNode child = new DirectoryTreeNode() { Name = currentDirectory.Name, Parent = root, Children = new List <DirectoryTreeNode>(), Files = new List <FileRecord>(), Record = currentDirectory, }; root.Children.Add(child); foreach (var entry in currentDirectory.Entries) { BuildDirectoryTree(entry, child, recordOffsets); } } else if (recordOffsets[directoryEntry.Offset] is FileRecord) { FileRecord currentFile = recordOffsets[directoryEntry.Offset] as FileRecord; // Skip empty .dat Files under Data/ //if (root.Name.Equals("Data") && currentFile.DataLength == 12) // return; currentFile.ContainingDirectory = root; root.Files.Add(currentFile); } }