예제 #1
0
        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");
            }
        }
예제 #2
0
        /// <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);
        }