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;
}