private Package ReadPackageV7(FileStream mainStream, BinaryReader reader) { var package = new Package(); mainStream.Seek(0, SeekOrigin.Begin); var header = BinUtils.ReadStruct<LSPKHeader7>(reader); OpenStreams(mainStream, (int)header.NumParts); for (uint i = 0; i < header.NumFiles; i++) { var entry = BinUtils.ReadStruct<FileEntry7>(reader); if (entry.ArchivePart == 0) { entry.OffsetInFile += header.DataOffset; } package.Files.Add(PackagedFileInfo.CreateFromEntry(entry, streams[entry.ArchivePart])); } return package; }
private Package ReadPackageV10(FileStream mainStream, BinaryReader reader) { var package = new Package(); mainStream.Seek(4, SeekOrigin.Begin); var header = BinUtils.ReadStruct<LSPKHeader10>(reader); OpenStreams(mainStream, header.NumParts); for (uint i = 0; i < header.NumFiles; i++) { var entry = BinUtils.ReadStruct<FileEntry13>(reader); if (entry.ArchivePart == 0) { entry.OffsetInFile += header.DataOffset; } // Add missing compression level flags entry.Flags = (entry.Flags & 0x0f) | 0x20; package.Files.Add(PackagedFileInfo.CreateFromEntry(entry, streams[entry.ArchivePart])); } return package; }
public void CreatePackage(string packagePath, string inputPath, uint version = Package.CurrentVersion, CompressionMethod compression = CompressionMethod.None, bool fastCompression = true) { this.progressUpdate("Enumerating files ...", 0, 1); var package = new Package(); EnumerateFiles(package, inputPath, inputPath); this.progressUpdate("Creating archive ...", 0, 1); var writer = new PackageWriter(package, packagePath); writer.writeProgress += WriteProgressUpdate; writer.Version = version; writer.Compression = compression; writer.CompressionLevel = fastCompression ? LS.CompressionLevel.FastCompression : LS.CompressionLevel.DefaultCompression; writer.Write(); writer.Dispose(); }
public void EnumerateFiles(Package package, string rootPath, string currentPath) { foreach (string filePath in Directory.GetFiles(currentPath)) { var relativePath = filePath.Substring(rootPath.Length); if (relativePath[0] == '/' || relativePath[0] == '\\') { relativePath = relativePath.Substring(1); } var fileInfo = FilesystemFileInfo.CreateFromEntry(filePath, relativePath); package.Files.Add(fileInfo); } foreach (string directoryPath in Directory.GetDirectories(currentPath)) { EnumerateFiles(package, rootPath, directoryPath); } }
private Package ReadPackageV13(FileStream mainStream, BinaryReader reader) { var package = new Package(); var header = BinUtils.ReadStruct<LSPKHeader13>(reader); if (header.Version != Package.CurrentVersion) { var msg = String.Format("Unsupported package version {0}; this extractor only supports {1}", header.Version, Package.CurrentVersion); throw new InvalidDataException(msg); } OpenStreams(mainStream, header.NumParts); mainStream.Seek(header.FileListOffset, SeekOrigin.Begin); int numFiles = reader.ReadInt32(); int fileBufferSize = Marshal.SizeOf(typeof(FileEntry13)) * numFiles; byte[] compressedFileList = reader.ReadBytes((int)header.FileListSize - 4); var uncompressedList = new byte[fileBufferSize]; var uncompressedSize = LZ4Codec.Decode(compressedFileList, 0, compressedFileList.Length, uncompressedList, 0, fileBufferSize, true); if (uncompressedSize != fileBufferSize) { var msg = String.Format("LZ4 compressor disagrees about the size of file headers; expected {0}, got {1}", fileBufferSize, uncompressedSize); throw new InvalidDataException(msg); } var ms = new MemoryStream(uncompressedList); var msr = new BinaryReader(ms); for (int i = 0; i < numFiles; i++) { var entry = BinUtils.ReadStruct<FileEntry13>(msr); package.Files.Add(PackagedFileInfo.CreateFromEntry(entry, streams[entry.ArchivePart])); } return package; }
public PackageWriter(Package package, string path) { this.package = package; this.path = path; }