Exemplo n.º 1
0
 public PakNode(Node parent, string name, PakFile pak, PakDirectory directory)
 {
     _parent       = parent;
     _name         = name;
     _pak          = pak;
     _pakDirectory = directory;
 }
Exemplo n.º 2
0
        public static PakFile OpenPak(string path)
        {
            var stream = File.OpenRead(path);

            using var reader = new BinaryReader(stream, Encoding.UTF8, true);

            // Read the header first.
            var magic = reader.ReadBytes(PakMagic.Length);

            if (!magic.SequenceEqual(PakMagic))
            {
                throw new InvalidOperationException("Unrecognized file type.");
            }

            // Read the pak file version. Not useful right now but future proofing is handy.
            var version = reader.ReadInt32();

            if (version == 1)
            {
                // Now we can read the Directory Tree.
                var directoryTreeSize = reader.ReadInt64();
                var directoryTree     = null as PakDirectory;

                using (var memStream = new MemoryStream())
                {
                    while (directoryTreeSize > 0)
                    {
                        var blockSize = Math.Min((int)directoryTreeSize, 2048);

                        var bytes = reader.ReadBytes(blockSize);
                        memStream.Write(bytes, 0, bytes.Length);

                        directoryTreeSize -= blockSize;
                    }

                    memStream.Seek(0, SeekOrigin.Begin);

                    using (var hReader = new BinaryReader(memStream, Encoding.UTF8))
                    {
                        directoryTree = ConstructDirectoryTree(hReader);
                    }
                }

                var currPos = stream.Position;

                var node = new PakFile(path, stream, directoryTree, currPos);

                return(node);
            }

            throw new InvalidOperationException("Unsupported Pak File Version.");
        }