Example #1
0
        public GgpkFile(FileRecord fileRecord, GgpkDirectory parent, GgpkFileSystem root)
        {
            Parent = parent;
            Name   = fileRecord.Name;
            Size   = fileRecord.DataLength;

            _offset = fileRecord.DataOffset;
            _root   = root;
        }
Example #2
0
        public GgpkFileSystem(string filePath)
        {
            Name         = new FileInfo(filePath).Name;
            SourceStream = File.OpenRead(filePath);

            var recordsList  = new List <IRecord>();
            var headerBytes  = new byte[sizeof(int) * 2];
            var streamLength = SourceStream.Length;

            while (SourceStream.Position < streamLength)
            {
                SourceStream.Read(headerBytes, 0, headerBytes.Length);
                RecordHeader header;
                unsafe
                {
                    fixed(byte *bt = &headerBytes[0])
                    {
                        header = *(RecordHeader *)bt;
                    }
                }

                switch (header.Type)
                {
                case RecordType.Ggpk:
                    recordsList.Add(new GgpkRecord(SourceStream, header.Length));
                    break;

                case RecordType.Directory:
                    recordsList.Add(new DirectoryRecord(SourceStream, header.Length));
                    break;

                case RecordType.File:
                    recordsList.Add(new FileRecord(SourceStream, header.Length));
                    break;

                case RecordType.Free:
                    recordsList.Add(new FreeRecord(SourceStream, header.Length));
                    break;

                default:
                    throw new InvalidOperationException("Invalid record");
                }
            }

            Records = recordsList.ToDictionary(c => c.Offset);

            var ggpkRecord = (GgpkRecord)Records.First().Value;

            var rootOffset =
                ggpkRecord.RecordOffsets.First(c => Records[c] is DirectoryRecord);

            var root = (DirectoryRecord)Records[rootOffset];

            var rootDirectory = new GgpkDirectory(root, Parent, this);

            _directories = rootDirectory.Directories.OfType <GgpkDirectory>().ToList();
            _files       = rootDirectory.Files.OfType <GgpkFile>().ToList();
            _indexDict   = new Lazy <Dictionary <string, IFileSystemEntry> >(() =>
            {
                return(_directories.Union(_files.Cast <IFileSystemEntry>())
                       .ToDictionary(c => c.Name));
            });
        }