public GgpkFile(FileRecord fileRecord, GgpkDirectory parent, GgpkFileSystem root) { Parent = parent; Name = fileRecord.Name; Size = fileRecord.DataLength; _offset = fileRecord.DataOffset; _root = root; }
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)); }); }