启动时就读取同步配置
parent
e86bc4bec8
commit
a1fb36ad30
70
App.xaml.cs
70
App.xaml.cs
|
|
@ -1,8 +1,10 @@
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Media;
|
using System.Windows.Media;
|
||||||
|
using System.Xml.Serialization;
|
||||||
using HeBianGu.Base.WpfBase;
|
using HeBianGu.Base.WpfBase;
|
||||||
using HeBianGu.Control.Guide;
|
using HeBianGu.Control.Guide;
|
||||||
using HeBianGu.Control.ThemeSet;
|
using HeBianGu.Control.ThemeSet;
|
||||||
|
|
@ -31,29 +33,12 @@ namespace HeBianGu.App.Disk
|
||||||
base.ConfigureServices(services);
|
base.ConfigureServices(services);
|
||||||
// 本地持久化
|
// 本地持久化
|
||||||
services.AddXmlSerialize();
|
services.AddXmlSerialize();
|
||||||
|
// 设置
|
||||||
|
services.AddSetting();
|
||||||
|
services.AddSettingPath();
|
||||||
|
|
||||||
// minio 服务
|
// minio 服务
|
||||||
services.AddSingleton<MinioService, MinioService>();
|
services.AddSingleton<MinioService, MinioService>();
|
||||||
var minioService = services.GetService<MinioService>();
|
|
||||||
var bucketName = minioService._bucketName;
|
|
||||||
var xmlSerializerService = services.GetService<ISerializerService>();
|
|
||||||
if (File.Exists("./settings.xml"))
|
|
||||||
{
|
|
||||||
var setting = xmlSerializerService.Load<SystemSetting>("./settings.xml");
|
|
||||||
if (!string.IsNullOrEmpty(setting.SyncDir))
|
|
||||||
{
|
|
||||||
if (setting.TaskCount == 0)
|
|
||||||
{
|
|
||||||
setting.TaskCount = 3;
|
|
||||||
}
|
|
||||||
// 是否启监听
|
|
||||||
if (SyncSetting.Instance.IsOn)
|
|
||||||
{
|
|
||||||
minioService.MirrorAsync1(bucketName, setting.SyncDir, setting.TaskCount);
|
|
||||||
minioService.RealTimeListen(bucketName, setting.SyncDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
services.AddWindowDialog();
|
services.AddWindowDialog();
|
||||||
services.AddObjectWindowDialog();
|
services.AddObjectWindowDialog();
|
||||||
|
|
@ -62,8 +47,7 @@ namespace HeBianGu.App.Disk
|
||||||
services.AddPropertyGridMessage();
|
services.AddPropertyGridMessage();
|
||||||
services.AddAutoColumnPagedDataGridMessage();
|
services.AddAutoColumnPagedDataGridMessage();
|
||||||
//services.AddNotifyMessage();
|
//services.AddNotifyMessage();
|
||||||
// 设置
|
|
||||||
services.AddSetting();
|
|
||||||
// 认证
|
// 认证
|
||||||
// services.AddIdentity(x => x.ProductFontSize = 50);
|
// services.AddIdentity(x => x.ProductFontSize = 50);
|
||||||
services.AddMvc();
|
services.AddMvc();
|
||||||
|
|
@ -76,7 +60,7 @@ namespace HeBianGu.App.Disk
|
||||||
x.Uri = "https://gitee.com/hebiangu/wpf-auto-update/raw/master/Install/Computer/AutoUpdate.xml";
|
x.Uri = "https://gitee.com/hebiangu/wpf-auto-update/raw/master/Install/Computer/AutoUpdate.xml";
|
||||||
x.UseIEDownload = true;
|
x.UseIEDownload = true;
|
||||||
});*/
|
});*/
|
||||||
services.AddSettingPath();
|
|
||||||
services.AddDESCryptService();
|
services.AddDESCryptService();
|
||||||
services.AddPrintBoxMessage();
|
services.AddPrintBoxMessage();
|
||||||
// ???
|
// ???
|
||||||
|
|
@ -133,6 +117,29 @@ namespace HeBianGu.App.Disk
|
||||||
//var find = dll.GetTypes().Where(x => typeof(IExplorerService).IsAssignableFrom(x))?.FirstOrDefault();
|
//var find = dll.GetTypes().Where(x => typeof(IExplorerService).IsAssignableFrom(x))?.FirstOrDefault();
|
||||||
//ServiceRegistry.Instance.Register(typeof(IExplorerService), find);
|
//ServiceRegistry.Instance.Register(typeof(IExplorerService), find);
|
||||||
//services.AddSingleton<IExplorerService, WindowExplorerServiceDemo>();
|
//services.AddSingleton<IExplorerService, WindowExplorerServiceDemo>();
|
||||||
|
|
||||||
|
var minioService = services.GetService<MinioService>();
|
||||||
|
var bucketName = minioService._bucketName;
|
||||||
|
var xmlSerializerService = services.GetService<ISerializerService>();
|
||||||
|
if (File.Exists("./settings.xml"))
|
||||||
|
{
|
||||||
|
var setting = xmlSerializerService.Load<SystemSetting>("./settings.xml");
|
||||||
|
if (!string.IsNullOrEmpty(setting.SyncDir))
|
||||||
|
{
|
||||||
|
if (setting.TaskCount == 0)
|
||||||
|
{
|
||||||
|
setting.TaskCount = 3;
|
||||||
|
}
|
||||||
|
var syncSettingPath = SyncSetting.Instance.GetPath();
|
||||||
|
var syncSetting = xmlSerializerService.Load<SyncSetting>(syncSettingPath);
|
||||||
|
if (syncSetting.IsOn)
|
||||||
|
{
|
||||||
|
// 是否启监听
|
||||||
|
minioService.MirrorAsync1(bucketName, setting.SyncDir, setting.TaskCount);
|
||||||
|
minioService.RealTimeListen(bucketName, setting.SyncDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Configure(IApplicationBuilder app)
|
protected override void Configure(IApplicationBuilder app)
|
||||||
|
|
@ -173,15 +180,26 @@ namespace HeBianGu.App.Disk
|
||||||
{
|
{
|
||||||
private bool _ison;
|
private bool _ison;
|
||||||
|
|
||||||
|
public string GetPath()
|
||||||
|
{
|
||||||
|
return GetDefaultPath();
|
||||||
|
}
|
||||||
|
|
||||||
[DefaultValue(false)]
|
[DefaultValue(false)]
|
||||||
[Display(Name = "自动同步")]
|
[Display(Name = "自动同步")]
|
||||||
public bool IsOn
|
public bool IsOn
|
||||||
{
|
{
|
||||||
get { return _ison; }
|
get
|
||||||
|
{
|
||||||
|
var x = GetDefaultPath();
|
||||||
|
//Console.WriteLine($"x: {x}");
|
||||||
|
// object obj1 = this.GetSerializerService()?.Load(x, typeof(SyncSetting));
|
||||||
|
return _ison;
|
||||||
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
_ison = value;
|
_ison = value;
|
||||||
RaisePropertyChanged("IsOn");
|
RaisePropertyChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,7 @@ namespace Hopetry.Services
|
||||||
/// <param name="maxParallel"></param>
|
/// <param name="maxParallel"></param>
|
||||||
public async Task MirrorAsync1(string bucket, string localDir, int maxParallel = 5)
|
public async Task MirrorAsync1(string bucket, string localDir, int maxParallel = 5)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine("开始全量同步");
|
||||||
Channel<(string ObjectName, string ETag)> SyncChannel = Channel.CreateBounded<(string, string)>(
|
Channel<(string ObjectName, string ETag)> SyncChannel = Channel.CreateBounded<(string, string)>(
|
||||||
new BoundedChannelOptions(1000)
|
new BoundedChannelOptions(1000)
|
||||||
{
|
{
|
||||||
|
|
@ -141,9 +142,10 @@ namespace Hopetry.Services
|
||||||
{
|
{
|
||||||
DateTime itemLastModified =
|
DateTime itemLastModified =
|
||||||
DateTime.Parse(item.LastModified, null, DateTimeStyles.RoundtripKind);
|
DateTime.Parse(item.LastModified, null, DateTimeStyles.RoundtripKind);
|
||||||
if ((ulong)localMeta.Size != item.Size || localMeta.LastModified < itemLastModified ||
|
//if ((ulong)localMeta.Size != item.Size || localMeta.LastModified < itemLastModified || !VerifyETag(localPath, item.ETag))
|
||||||
!VerifyETag(localPath, item.ETag))
|
if (!VerifyETag(localPath, item.ETag))
|
||||||
{
|
{
|
||||||
|
Console.WriteLine($"{localPath} 加入下载队列");
|
||||||
await SyncChannel.Writer.WriteAsync((item.Key, item.ETag));
|
await SyncChannel.Writer.WriteAsync((item.Key, item.ETag));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -306,10 +308,16 @@ namespace Hopetry.Services
|
||||||
// 校验本地文件 ETag(MinIO 使用 MD5)
|
// 校验本地文件 ETag(MinIO 使用 MD5)
|
||||||
public bool VerifyETag(string filePath, string remoteETag)
|
public bool VerifyETag(string filePath, string remoteETag)
|
||||||
{
|
{
|
||||||
|
if (remoteETag.Contains("-"))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
using var md5 = MD5.Create();
|
using var md5 = MD5.Create();
|
||||||
using var stream = File.OpenRead(filePath);
|
using var stream = File.OpenRead(filePath);
|
||||||
var localHash = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLower();
|
var localHash = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLower();
|
||||||
return remoteETag.Trim('"').Equals(localHash, StringComparison.OrdinalIgnoreCase);
|
var x = remoteETag.Trim('"').Equals(localHash, StringComparison.OrdinalIgnoreCase);
|
||||||
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 实时监听方法
|
// 实时监听方法
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ public class SyncViewModel : MvcViewModelBase
|
||||||
|
|
||||||
private async Task SyncDataQuick()
|
private async Task SyncDataQuick()
|
||||||
{
|
{
|
||||||
await Task.Run(async () => await _minioService.MirrorAsync1(_minioService._bucketName, SyncDir, _taskCount));
|
_minioService.MirrorAsync1(_minioService._bucketName, SyncDir, _taskCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Loaded(string args)
|
protected override void Loaded(string args)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue