| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- using Serilog;
- namespace YZWater.Core.Services;
- /// <summary>
- /// 鏁版嵁搴撳浠芥湇鍔
- /// </summary>
- public static class BackupService
- {
- private static readonly string BackupDir = "Backups";
- /// <summary>
- /// 鍒涘缓鏁版嵁搴撳浠
- /// </summary>
- public static async Task<(bool Success, string Path)> BackupAsync()
- {
- try
- {
- Directory.CreateDirectory(BackupDir);
- var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
- var backupPath = Path.Combine(BackupDir, $"yzwater_backup_{timestamp}.db");
- // SQLite 澶囦唤锛氬鍒舵暟鎹簱鏂囦欢
- var sourcePath = "yzwater.db";
- if (!File.Exists(sourcePath))
- {
- Log.Warning("鏁版嵁搴撴枃浠朵笉瀛樺湪: {Path}", sourcePath);
- return (false, string.Empty);
- }
- // 浣跨敤 SqlSugar 鐨勫浠藉姛鑳
- var db = DatabaseService.Db;
- await Task.Run(() =>
- {
- File.Copy(sourcePath, backupPath, true);
- });
- Log.Information("鏁版嵁搴撳浠芥垚鍔: {Path}", backupPath);
- AuditService.Log("绯荤粺", "Backup", $"鏁版嵁搴撳浠: {backupPath}");
- return (true, backupPath);
- }
- catch (Exception ex)
- {
- Log.Error(ex, "鏁版嵁搴撳浠藉け璐");
- return (false, string.Empty);
- }
- }
- /// <summary>
- /// 鎭㈠鏁版嵁搴
- /// </summary>
- public static async Task<bool> RestoreAsync(string backupPath)
- {
- try
- {
- if (!File.Exists(backupPath))
- {
- Log.Warning("澶囦唤鏂囦欢涓嶅瓨鍦: {Path}", backupPath);
- return false;
- }
- var targetPath = "yzwater.db";
- // 鍏堝浠藉綋鍓嶆暟鎹簱
- var preRestoreBackup = Path.Combine(BackupDir, $"yzwater_pre_restore_{DateTime.Now:yyyyMMdd_HHmmss}.db");
- if (File.Exists(targetPath))
- {
- File.Copy(targetPath, preRestoreBackup, true);
- }
- await Task.Run(() =>
- {
- File.Copy(backupPath, targetPath, true);
- });
- Log.Information("鏁版嵁搴撴仮澶嶆垚鍔燂紝鎭㈠鍓嶅浠: {Path}", preRestoreBackup);
- AuditService.Log("绯荤粺", "Restore", $"鏁版嵁搴撴仮澶: {backupPath}锛屾仮澶嶅墠澶囦唤: {preRestoreBackup}");
- return true;
- }
- catch (Exception ex)
- {
- Log.Error(ex, "鏁版嵁搴撴仮澶嶅け璐");
- return false;
- }
- }
- /// <summary>
- /// 鑾峰彇澶囦唤鍒楄〃
- /// </summary>
- public static List<(string Path, DateTime Time, long Size)> GetBackups()
- {
- if (!Directory.Exists(BackupDir))
- return new List<(string, DateTime, long)>();
- return Directory.GetFiles(BackupDir, "*.db")
- .Select(f => new FileInfo(f))
- .OrderByDescending(f => f.CreationTime)
- .Select(f => (f.FullName, f.CreationTime, f.Length))
- .ToList();
- }
- /// <summary>
- /// 娓呯悊鏃у浠斤紙淇濈暀鏈杩 N 涓級
- /// </summary>
- public static int CleanupOldBackups(int keepCount = 10)
- {
- if (!Directory.Exists(BackupDir))
- return 0;
- var backups = Directory.GetFiles(BackupDir, "*.db")
- .Select(f => new FileInfo(f))
- .OrderByDescending(f => f.CreationTime)
- .Skip(keepCount)
- .ToList();
- foreach (var backup in backups)
- {
- try
- {
- backup.Delete();
- Log.Debug("宸插垹闄ゆ棫澶囦唤: {Path}", backup.FullName);
- }
- catch (Exception ex)
- {
- Log.Warning(ex, "鍒犻櫎鏃у浠藉け璐: {Path}", backup.FullName);
- }
- }
- if (backups.Count > 0)
- Log.Information("宸叉竻鐞 {Count} 涓棫澶囦唤", backups.Count);
- return backups.Count;
- }
- }
|