/// <summary> /// Attempts to apply a patch of given type from a given URL or File Path via simple zip extraction. /// </summary> /// <param name="patchType"></param> /// <param name="path"></param> /// <returns></returns> public async Task ApplyPatch(FanPatchType patchType, string path) { var patchName = GetPatchTypeName(patchType); Stream buffer = await TryObtainFile(path); if (buffer == null) { Triggers.OnFanPatchNotFound(); return; } Triggers.OnFanPatching(patchType.ToString()); await Task.Run(() => { var backupFolder = Path.Combine(Settings.BackupDirectory(), patchName); if (Directory.Exists(backupFolder) == false) { Directory.CreateDirectory(backupFolder); } using (var archive = ArchiveFactory.Open(buffer)) { var reader = archive.ExtractAllEntries(); while (reader.MoveToNextEntry()) { if (reader.Entry.IsDirectory) { continue; } var name = Path.GetFileName(reader.Entry.Key); var target = Path.Combine(Settings.DataWin32Directory(), name); if (File.Exists(target)) { var backup = Path.Combine(backupFolder, name); File.Move(target, backup); } using (var file = new FileStream(target, FileMode.Create)) { reader.WriteEntryTo(file); } } } buffer.Dispose(); }); if (patchType == FanPatchType.EnglishPatch) { Settings.EnglishPatchVersion = Path.GetFileNameWithoutExtension(path); } if (patchType == FanPatchType.EnglishLargePatch) { Settings.EnglishLargePatchVersion = Path.GetFileNameWithoutExtension(path); } Triggers.OnFanPatchSuccessful(patchName); }
/// <summary> /// Gets the known, usual Tweaker backup directory. /// </summary> public static string BackupDirectory(this ITweakerSettings settings) { return(Path.Combine(settings.DataWin32Directory(), "backup")); }