public PackfileIndex(string indexPath, FileMode mode = FileMode.Open) { Entries = new Dictionary <ulong, IndexEntry>(); if (mode == FileMode.Open) { IndexFileHandle = File.Open(indexPath, mode, FileAccess.Read, FileShare.Read); using (var reader = new BinaryReader(IndexFileHandle, Encoding.UTF8, true)) { uint magic = reader.ReadUInt32(); uint entryCount = reader.ReadUInt32(); if (magic != HardcodedMagic) { throw new InvalidDataException("Unknown header magic"); } for (uint i = 0; i < entryCount; i++) { var entry = IndexEntry.FromData(reader); Entries[entry.PathHash] = entry; } } } else if (mode == FileMode.Create || mode == FileMode.CreateNew) { throw new NotImplementedException("Writing archives is not supported at the moment"); } else { throw new NotImplementedException("Archive file mode must be Open, Create, or CreateNew"); } }
/// <summary> /// Deserialize a PackfileIndex entry from a BinaryReader. /// </summary> /// <param name="reader">Source stream</param> public static PackfileIndex FromData(BinaryReader reader) { var index = new PackfileIndex(); uint magic = reader.ReadUInt32(); uint entryCount = reader.ReadUInt32(); if (magic != HardcodedMagic) { throw new InvalidDataException("Unknown header magic"); } index._entries = new List <IndexEntry>((int)entryCount); for (uint i = 0; i < entryCount; i++) { index._entries.Add(IndexEntry.FromData(reader)); } return(index); }