diff --git a/App.xaml.cs b/App.xaml.cs index cda2af6..0333bdc 100644 --- a/App.xaml.cs +++ b/App.xaml.cs @@ -90,7 +90,7 @@ namespace HeBianGu.App.Disk #endregion - + #region - WindowCaption - //以下各种功能按钮 @@ -120,100 +120,147 @@ namespace HeBianGu.App.Disk //services.AddSingleton(); - var minioService = services.GetService(); + foreach (DriveInfo drive in DriveInfo.GetDrives()) + { + if (drive.DriveType != DriveType.Fixed) continue; // 只获取固定硬盘 + Console.WriteLine( + // D:\ (Fixed) 软件 NTFS 329113399296 + $"{drive.Name} ({drive.DriveType}) {drive.VolumeLabel} {drive.DriveFormat} {drive.TotalSize} {drive.AvailableFreeSpace}"); + } + + var minioService = services.GetService(); var bucketName = minioService._bucketName; var xmlSerializerService = services.GetService(); - if (File.Exists("./settings.xml")) + if (!File.Exists("./settings.xml")) { - var setting = xmlSerializerService.Load("./settings.xml"); - if (!string.IsNullOrEmpty(setting.SyncDir)) + var tempSetting = new SystemSetting(); + tempSetting.TaskCount = 3; + tempSetting.SyncDir = Path.Combine(SelectDrive(),"HopetryBoxData"); + if (!Directory.Exists(tempSetting.SyncDir)) { - if (setting.TaskCount == 0) - { - setting.TaskCount = 3; - } + Directory.CreateDirectory(tempSetting.SyncDir); + } + xmlSerializerService.Save("./settings.xml", tempSetting); + } - // 创建统一的取消令牌源 - var cancelToken = new CancellationTokenSource(); - var temp = SyncSetting.Instance; - var notRun = true; - // 注册设置变更监听 - temp.PropertyChanged += (s, e) => + var setting = xmlSerializerService.Load("./settings.xml"); + if (string.IsNullOrEmpty(setting.SyncDir)) + { + var selectDrive = SelectDrive(); + + setting.SyncDir = Path.Combine(selectDrive, "HopetryBoxData"); + if (!Directory.Exists(setting.SyncDir)) + { + Directory.CreateDirectory(setting.SyncDir); + } + + // 保存配置 + xmlSerializerService.Save("./settings.xml", setting); + } + + if (setting.TaskCount == 0) + { + setting.TaskCount = 3; + } + + // 创建统一的取消令牌源 + var cancelToken = new CancellationTokenSource(); + var temp = SyncSetting.Instance; + var notRun = true; + // 注册设置变更监听 + temp.PropertyChanged += (s, e) => + { + if (temp.IsOn && notRun) + { + // 异步启动服务 + Console.WriteLine("启动同步:"); + try { - if (temp.IsOn && notRun) + minioService.MirrorAsync(bucketName, setting.SyncDir, setting.TaskCount); + minioService.RealTimeListen(bucketName, setting.SyncDir, + cancellationToken: cancelToken.Token); + notRun = false; + } + catch (OperationCanceledException) + { + Console.WriteLine("同步监听已取消"); + } + catch (Exception ex) + { + Console.WriteLine($"同步失败: {ex.Message}"); + } + } + // 运行中 且 temp.IsOn 变成 false + else if (!notRun && !temp.IsOn) + { + notRun = true; + // 当设置关闭时取消所有任务 + cancelToken.Cancel(); // 取消任务 + cancelToken.Dispose(); + cancelToken = new CancellationTokenSource(); + } + }; + /*var delayTimer = new DispatcherTimer(); + delayTimer.Interval = TimeSpan.FromSeconds(5); + delayTimer.Tick += async (s, e) => + { + delayTimer.Stop(); // 确保只执行一次 + // 异步操作不会阻塞UI + await Current.Dispatcher.InvokeAsync(() => + { + // 注册设置变更监听 + SyncSetting.Instance.PropertyChanged += (s1, e1) => + { + if (SyncSetting.Instance.IsOn) { // 异步启动服务 - Console.WriteLine("启动同步:"); - try - { - minioService.MirrorAsync(bucketName, setting.SyncDir, setting.TaskCount); - minioService.RealTimeListen(bucketName, setting.SyncDir, - cancellationToken: cancelToken.Token); - notRun = false; - } - catch (OperationCanceledException) - { - Console.WriteLine("同步监听已取消"); - } - catch (Exception ex) - { - Console.WriteLine($"同步失败: {ex.Message}"); - } + _ = StartSyncServicesAsync(); } - // 运行中 且 temp.IsOn 变成 false - else if (!notRun && !temp.IsOn) + else { - notRun = true; // 当设置关闭时取消所有任务 - cancelToken.Cancel(); // 取消任务 + cancelToken.Cancel(); cancelToken.Dispose(); cancelToken = new CancellationTokenSource(); } }; - /*var delayTimer = new DispatcherTimer(); - delayTimer.Interval = TimeSpan.FromSeconds(5); - delayTimer.Tick += async (s, e) => - { - delayTimer.Stop(); // 确保只执行一次 - // 异步操作不会阻塞UI - await Current.Dispatcher.InvokeAsync(() => - { - // 注册设置变更监听 - SyncSetting.Instance.PropertyChanged += (s1, e1) => - { - if (SyncSetting.Instance.IsOn) - { - // 异步启动服务 - _ = StartSyncServicesAsync(); - } - else - { - // 当设置关闭时取消所有任务 - cancelToken.Cancel(); - cancelToken.Dispose(); - cancelToken = new CancellationTokenSource(); - } - }; - }); - }; + }); + }; - delayTimer.Start();*/ + delayTimer.Start();*/ - /*var syncSettingPath = SyncSetting.Instance.GetPath(); - var syncSetting = xmlSerializerService.Load(syncSettingPath); - SyncSetting.Instance.IsOn = syncSetting.IsOn; - if (syncSetting.IsOn) - { - // 是否启监听 - minioService.MirrorAsync1(bucketName, setting.SyncDir, setting.TaskCount); - }*/ + /*var syncSettingPath = SyncSetting.Instance.GetPath(); + var syncSetting = xmlSerializerService.Load(syncSettingPath); + SyncSetting.Instance.IsOn = syncSetting.IsOn; + if (syncSetting.IsOn) + { + // 是否启监听 + minioService.MirrorAsync1(bucketName, setting.SyncDir, setting.TaskCount); + }*/ - /*minioService.RealTimeListen(bucketName, setting.SyncDir, - cancellationToken: cancelToken.Token);*/ + /*minioService.RealTimeListen(bucketName, setting.SyncDir, + cancellationToken: cancelToken.Token);*/ + } + + private static string SelectDrive() + { + var maxFreeSpace = 0L; + var selectDrive = ""; + // 如果同步目录为空,则选择一个本地空闲空间比较大的分区 + foreach (DriveInfo drive in DriveInfo.GetDrives()) + { + if (drive.DriveType != DriveType.Fixed) continue; // 只获取固定硬盘 + + if (drive.AvailableFreeSpace > maxFreeSpace) + { + maxFreeSpace = drive.AvailableFreeSpace; + selectDrive = drive.Name; } } + + return selectDrive; } protected override void Configure(IApplicationBuilder app) diff --git a/Hopetry.csproj b/Hopetry.csproj index 2c87905..2486aa2 100644 --- a/Hopetry.csproj +++ b/Hopetry.csproj @@ -57,6 +57,7 @@ +