using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using TEAMModelOS.SDK.DI;
using TEAMModelOS.SDK.Models.Cosmos.BI;
using Azure.Storage.Blobs.Models;
using Azure;
using Azure.Storage.Sas;
using System.Linq;
using Azure.Storage.Blobs.Specialized;
using System.Web;
namespace TEAMModelOS.SDK.Models.Service
{
public class BatchCopyFileService
{
///
/// 执行批量复制操作方法
///
///
///
///
///
public static async Task CopyFile(DingDing _dingDing,AzureStorageFactory _azureStorage, BatchCopyFile batchCopyFile)
{
try
{
List> filelist = new(); //可复制256M以上文件
//List>> filelist = new(); //复制256M以下文件
var azureClient = _azureStorage.GetBlobContainerClient($"{batchCopyFile.blobCntr}");//获取容器连接地址
//先删除原有的文件
List>> DelList = new();
await foreach (BlobItem blobItem in azureClient.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"yxpt/{batchCopyFile.newFileName}/"))
{
DelList.Add(azureClient.GetBlobBaseClient(blobItem.Name).DeleteIfExistsAsync());
}
if (DelList.Count <= 256)
{
await Task.WhenAll(DelList);
}
else
{
int pages = (DelList.Count + 255) / 256;
for (int i = 0; i < pages; i++)
{
List>> delList = DelList.Skip((i) * 256).Take(256).ToList();
await Task.WhenAll(delList);
}
}
//查询目录下所有容器路径
await foreach (BlobItem blobItem in azureClient.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"yxpt/{batchCopyFile.oldFileName}/"))
{
string newurl = $"{blobItem.Name}".Replace($"/{batchCopyFile.oldFileName}/", $"/{batchCopyFile.newFileName}/");//替换成新的容器路径
var urlSas = _azureStorage.GetBlobSAS($"{batchCopyFile.blobCntr}", blobItem.Name, BlobSasPermissions.Read | BlobSasPermissions.List); //获取容器sas和有效期
filelist.Add(azureClient.GetBlobClient(newurl).StartCopyFromUriAsync(new Uri(urlSas.fullUri))); //可复制256M以上文件
//filelist.Add(azureClient.GetBlobClient(newurl).SyncCopyFromUriAsync(new Uri(urlSas))); //添加复制文件到集合执行复制操作 复制256M以下文件
}
if (filelist.Count <= 256)
{
await Task.WhenAll(filelist);
}
else
{
int pages = (filelist.Count + 255) / 256;
for (int i = 0; i < pages; i++)
{
List> rspBlobCopyInfos = filelist.Skip((i) * 256).Take(256).ToList(); //可复制256M以上文件
//List>> rspBlobCopyInfos = filelist.Skip((i) * 256).Take(256).ToList(); //复制256M以下文件
await Task.WhenAll(rspBlobCopyInfos);
}
}
return 200;
}
catch (Exception ex)
{
await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-Batch-CopyFile \n {ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
return -1;
}
}
///
/// 修复研修平台多人使用个账户,分开账户复制文件时使用
///
///
///
///
///
///
///
public static async Task SingleCopyFile(AzureStorageFactory _azureStorage, string blobName, string oldFile, string oldId, string newId)
{
try
{
var azureClient = _azureStorage.GetBlobContainerClient($"{blobName}");//获取容器连接地址
string newurl = oldFile.Substring(oldFile.IndexOf($"{blobName}/") + $"{blobName}/".Length).Replace($"{oldId}", $"{newId}");//替换成新的容器路径
string oldFileName = oldFile.Substring(oldFile.IndexOf($"{blobName}/") + $"{blobName}/".Length);
var urlSas = _azureStorage.GetBlobSAS($"{blobName}", $"{HttpUtility.UrlDecode(oldFileName)}", BlobSasPermissions.Read | BlobSasPermissions.List); //获取容器sas和有效期
//var respCopy = azureClient.GetBlobClient(HttpUtility.UrlDecode(newurl)).SyncCopyFromUri(new Uri(urlSas)); //可复制256M以下文件
var respCopy1 = await azureClient.GetBlobClient(HttpUtility.UrlDecode(newurl)).StartCopyFromUriAsync(new Uri(urlSas.fullUri)); //可复制256M以上文件
if (!string.IsNullOrEmpty($"{respCopy1.Id}"))
return 200;
else
return 400;
}
catch(Exception ex)
{
return 400;
}
}
}
}