/// <summary> /// Unpacks all the files within the volume. /// </summary> public void UnpackFiles(IEnumerable <int> fileIndexesToExtract) { FileEntryBTree rootEntries = new FileEntryBTree(this.TableOfContents.Data, (int)TableOfContents.RootAndFolderOffsets[0]); var unpacker = new EntryUnpacker(this, OutputDirectory, "", fileIndexesToExtract.ToList()); rootEntries.TraverseAndUnpack(unpacker); }
public void UnpackFromKey(FileEntryKey entryKey) { string entryPath = _volume.GetEntryPath(entryKey, ParentDirectory); if (string.IsNullOrEmpty(entryPath)) { Program.Log($"Could not determine entry path for Entry key at name Index {entryKey.NameIndex}"); return; } string fullEntryPath = Path.Combine(OutDir ?? string.Empty, entryPath); if (entryKey.Flags.HasFlag(EntryKeyFlags.Directory)) { if (_fileIndexesToExtract.Count == 0) // Make sure not to spam when not needed { if (!_volume.IsPatchVolume || _volume.NoUnpack) { Program.Log($"[:] Entering Directory: {entryPath}"); } } var childEntryBTree = new FileEntryBTree(_volume.TableOfContents.Data, (int)_volume.TableOfContents.RootAndFolderOffsets[(int)entryKey.EntryIndex]); var childUnpacker = new EntryUnpacker(_volume, OutDir, entryPath, _fileIndexesToExtract); childEntryBTree.TraverseAndUnpack(childUnpacker); } else { if (_fileIndexesToExtract.Count != 0 && !_fileIndexesToExtract.Contains((int)entryKey.EntryIndex)) { return; } if (!_volume.IsPatchVolume || _volume.NoUnpack) { Program.Log($"[:] Extracting: {entryPath}"); } var nodeBTree = new FileInfoBTree(_volume.TableOfContents.Data, (int)_volume.TableOfContents.NodeTreeOffset); var nodeKey = new FileInfoKey(entryKey.EntryIndex); uint nodeIndex = nodeBTree.SearchIndexByKey(nodeKey); if (nodeIndex != FileInfoKey.InvalidIndex) { _volume.UnpackNode(nodeKey, fullEntryPath); } } }