/// <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));
                }
            }
        }
Example #2
0
        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);
        }