using System.Windows; using System.Windows.Input; using HeBianGu.Base.WpfBase; using Hopetry.Models; using SqlSugar; namespace Hopetry.Services; using System; using System.IO; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using System.ComponentModel; using Minio; [SugarTable(TableName = "download_task")] public class MinioDownloadTask : INotifyPropertyChanged { private readonly MinioService _minio; /// /// /// private CancellationTokenSource _cts; /// /// /// private ManualResetEventSlim _pauseEvent = new(true); // 任务属性(绑定到UI) [SugarColumn(ColumnName = "task_id")] public int TaskId { get; set; } [SugarColumn(ColumnName = "file_name")] public string FileName { get; set; } [SugarColumn(ColumnName = "bucket_name")] public string Bucket { get; set; } [SugarColumn(ColumnName = "object_key")] public string ObjectKey { get; set; } [SugarColumn(ColumnName = "total_size")] public long TotalSize { get; private set; } [SugarColumn(ColumnName = "downloaded")] public long Downloaded { get; private set; } [SugarColumn(ColumnName = "file_path")] public string FilePath { get; set; } [SugarColumn(ColumnName = "status")] public string Status { get; private set; } = "等待中"; public string Progress { get { return TotalSize == 0 ? "0%" : $"{(Downloaded * 100 / TotalSize):0.0}%"; } } // 命令 public ICommand PauseCommand { get; } public ICommand CancelCommand { get; } public MinioDownloadTask() { PauseCommand = new CustomCommand(OnPause); CancelCommand = new CustomCommand(OnCancel); } public MinioDownloadTask(MinioService minio, string bucket, string objectKey) { _minio = minio; Bucket = bucket; ObjectKey = objectKey; TaskId = Interlocked.Increment(ref _globalId); FileName = Path.GetFileName(objectKey); PauseCommand = new CustomCommand(OnPause); CancelCommand = new CustomCommand(OnCancel); } /// /// 下载 /// /// public async Task StartDownload(string savePath) { Status = "初始化"; _cts = new CancellationTokenSource(); var tmpPath = $"{savePath}.download"; try { // 断点续传初始化 if (File.Exists(tmpPath)) Downloaded = new FileInfo(tmpPath).Length; // 获取文件信息 var stat = await _minio.GetObjectMetadata(Bucket, ObjectKey); TotalSize = stat.Size; if (Downloaded >= TotalSize) { Status = "已完成"; return; } // todo 下载逻辑 Status = "已完成"; } catch (OperationCanceledException) { Status = "已取消"; } catch (Exception ex) { Status = $"错误:{ex.Message}"; } finally { _pauseEvent.Dispose(); OnPropertyChanged(nameof(Status)); } } private void OnPause() { if (Status == "下载中") { _pauseEvent.Reset(); Status = "已暂停"; } else if (Status == "已暂停") { _pauseEvent.Set(); Status = "下载中"; } OnPropertyChanged(nameof(Status)); } private void OnCancel() { _cts?.Cancel(); Status = "已取消"; OnPropertyChanged(nameof(Status)); } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); private static int _globalId; }