using System; using System.IO; using System.Linq; namespace IPA.Patcher { public static class BackupManager { public static BackupUnit FindLatestBackup(PatchContext context) { new DirectoryInfo(context.BackupPath).Create(); return new DirectoryInfo(context.BackupPath) .GetDirectories() .OrderByDescending(p => p.Name) .Select(p => BackupUnit.FromDirectory(p, context)) .FirstOrDefault(); } public static bool HasBackup(PatchContext context) { return FindLatestBackup(context) != null; } public static bool Restore(PatchContext context) { var backup = FindLatestBackup(context); if(backup != null) { backup.Restore(); backup.Delete(); DeleteEmptyDirs(context.ProjectRoot); return true; } return false; } public static void DeleteEmptyDirs(string dir) { if (string.IsNullOrEmpty(dir)) throw new ArgumentException( "Starting directory is a null reference or an empty string", nameof(dir)); try { foreach (var d in Directory.EnumerateDirectories(dir)) { DeleteEmptyDirs(d); } var entries = Directory.EnumerateFileSystemEntries(dir); if (entries.Any()) return; try { Directory.Delete(dir); } catch (UnauthorizedAccessException) { } catch (DirectoryNotFoundException) { } } catch (UnauthorizedAccessException) { } } } }