public static void Process(Context ctx) { using (var file = new LocalStorage(ctx.Options.InFile, FileAccess.ReadWrite)) { bool signNeeded = ctx.Options.SignSave; var save = new SaveDataFileSystem(ctx.Keyset, file, ctx.Options.IntegrityLevel, true); if (ctx.Options.Validate) { save.Verify(ctx.Logger); } if (ctx.Options.OutDir != null) { save.SaveDataFileSystemCore.Extract(ctx.Options.OutDir, ctx.Logger); } if (ctx.Options.DebugOutDir != null) { string dir = ctx.Options.DebugOutDir; ExportSaveDebug(ctx, dir, save); } try { if (ctx.Options.ReplaceFileDest != null && ctx.Options.ReplaceFileSource != null) { string destFilename = ctx.Options.ReplaceFileDest; if (!destFilename.StartsWith("/")) { destFilename = '/' + destFilename; } using (IFile inFile = new LocalFile(ctx.Options.ReplaceFileSource, OpenMode.Read)) { using (IFile outFile = save.OpenFile(destFilename, OpenMode.ReadWrite)) { if (inFile.GetSize() != outFile.GetSize()) { outFile.SetSize(inFile.GetSize()); } inFile.CopyTo(outFile, ctx.Logger); ctx.Logger.LogMessage($"Replaced file {destFilename}"); } } signNeeded = true; } if (ctx.Options.RepackSource != null) { var source = new LocalFileSystem(ctx.Options.RepackSource); save.CleanDirectoryRecursively("/"); save.Commit(ctx.Keyset); source.CopyFileSystem(save); signNeeded = true; } } finally { save.Commit(ctx.Keyset); } if (ctx.Options.TrimSave) { save.FsTrim(); signNeeded = true; ctx.Logger.LogMessage("Trimmed save file"); } if (signNeeded) { if (save.Commit(ctx.Keyset)) { ctx.Logger.LogMessage("Successfully signed save file"); } else { ctx.Logger.LogMessage("Unable to sign save file. Do you have all the required keys?"); } return; } if (ctx.Options.ListFiles) { foreach (DirectoryEntry entry in save.EnumerateEntries()) { ctx.Logger.LogMessage(entry.FullPath); } } ctx.Logger.LogMessage(save.Print()); //ctx.Logger.LogMessage(PrintFatLayout(save.SaveDataFileSystemCore)); } }