static void Replace(string archivePath, string fileInArchive, string fileOnDisk, string newArchivePath) { CrafArchive archive = null; try { archive = CrafArchive.Open(archivePath); var task = archive.LoadAsync(new Progress <int>()); task.Wait(); archive.CloseReader(); } catch (IOException) { Console.WriteLine("Could not open archive"); Environment.Exit(-1); } var id = archive.IndexOfDiskPath(fileInArchive); if (id == -1) { Console.WriteLine("File in archive not found"); Environment.Exit(-1); } Console.WriteLine("Loading new file..."); try { archive.Replace(id, File.ReadAllBytes(fileOnDisk)); } catch (IOException ex) { Console.WriteLine("Could not read replacement file"); Console.WriteLine("Details: " + ex.Message); Environment.Exit(-1); } Console.WriteLine("Writing back files..."); var fivePercent = archive.Count() / 20; if (fivePercent == 0) { fivePercent = 1; } try { var task2 = archive.SaveAsync(newArchivePath, new Progress <int>((i) => { if (i % fivePercent == 0) { Console.Write("."); } })); task2.Wait(); } catch (IOException ex) { Console.WriteLine(""); Console.WriteLine("Could not write new archive"); Console.WriteLine("Details: " + ex.Message); Environment.Exit(-1); } Console.WriteLine(""); }