123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- 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
- {
- /// <summary>
- /// 执行批量复制操作方法
- /// </summary>
- /// <param name="_dingDing"></param>
- /// <param name="_azureStorage"></param>
- /// <param name="batchCopyFile"></param>
- /// <returns></returns>
- public static async Task<int> CopyFile(DingDing _dingDing,AzureStorageFactory _azureStorage, BatchCopyFile batchCopyFile)
- {
- try
- {
- List<Task<CopyFromUriOperation>> filelist = new(); //可复制256M以上文件
- //List<Task<Response<BlobCopyInfo>>> filelist = new(); //复制256M以下文件
- var azureClient = _azureStorage.GetBlobContainerClient($"{batchCopyFile.blobCntr}");//获取容器连接地址
- //先删除原有的文件
- List<Task<Response<bool>>> 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<Task<Response<bool>>> 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<Task<CopyFromUriOperation>> rspBlobCopyInfos = filelist.Skip((i) * 256).Take(256).ToList(); //可复制256M以上文件
- //List<Task<Response<BlobCopyInfo>>> 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;
- }
- }
- /// <summary>
- /// 修复研修平台多人使用个账户,分开账户复制文件时使用
- /// </summary>
- /// <param name="_azureStorage"></param>
- /// <param name="blobName"></param>
- /// <param name="oldFile"></param>
- /// <param name="oldId"></param>
- /// <param name="newId"></param>
- /// <returns></returns>
- public static async Task<int> 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;
- }
- }
- }
- }
|