/// <summary> /// Iterates through the pack file and records the offsets and headers of each record found /// </summary> /// <param name="pathToGgpk">Path to pack file to read</param> /// <param name="output">Output function</param> public void ReadRecordOffsets(string pathToGgpk, Action <string> output) { var previousPercentComplete = 0.0f; using (var fs = OpenFile(pathToGgpk, out _isReadOnly)) { var br = new BinaryReader(fs); var streamLength = br.BaseStream.Length; while (br.BaseStream.Position < streamLength) { var currentOffset = br.BaseStream.Position; var record = ReadRecord(br); RecordOffsets.Add(currentOffset, record); var percentComplete = currentOffset / (float)streamLength; if (percentComplete - previousPercentComplete >= 0.10f) { output?.Invoke(String.Format("\t{0:00.00}%{1}", 100.0 * percentComplete, Environment.NewLine)); previousPercentComplete = percentComplete; } } if (output != null) { var percentReady = 100.0f * br.BaseStream.Position / br.BaseStream.Length; output(String.Format("\t{0:00.00}%{1}", percentReady, Environment.NewLine)); } } }
public void DeserializeRecords(string pathToBin, Action<string> output) { if (output != null) { output(Environment.NewLine); output("Deserializing... "); } var Serialized = File.OpenRead(pathToBin); var s = new BinaryReader(Serialized); while (Serialized.Length - Serialized.Position > 1) { long offset = s.ReadInt64(); switch (s.ReadByte()) { case 1: RecordOffsets.Add(offset, new FileRecord(s.ReadInt64(), s.ReadUInt32(), s.ReadBytes(32), s.ReadString(), s.ReadInt64(), s.ReadInt64())); break; case 2: long recordBegin = s.ReadInt64(); uint length = s.ReadUInt32(); long[] recordOffsets = new long[s.ReadInt32()]; for (int i = 0; i < recordOffsets.Length; i++) { recordOffsets[i] = s.ReadInt64(); } RecordOffsets.Add(offset, new GgpkRecord(recordBegin, length, recordOffsets)); break; case 3: RecordOffsets.Add(offset, new FreeRecord(s.ReadUInt32(), s.ReadInt64(), s.ReadInt64())); break; case 4: long recordBegin2 = s.ReadInt64(); uint length2 = s.ReadUInt32(); byte[] hash = s.ReadBytes(32); string name = s.ReadString(); long entriesBegin = s.ReadInt64(); int entriesCount = s.ReadInt32(); var entries = new List<DirectoryRecord.DirectoryEntry>(entriesCount); for (int i = 0; i < entriesCount; i++) { entries.Add(new DirectoryRecord.DirectoryEntry { EntryNameHash = s.ReadUInt32(), Offset = s.ReadInt64(), }); } RecordOffsets.Add(offset, new DirectoryRecord(recordBegin2, length2, hash, name, entriesBegin, entries)); break; } } Serialized.Flush(); Serialized.Close(); output?.Invoke("Done!" + Environment.NewLine); }