BatchCopyFileService.cs 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Threading.Tasks;
  5. using TEAMModelOS.SDK.DI;
  6. using TEAMModelOS.SDK.Models.Cosmos.BI;
  7. using Azure.Storage.Blobs.Models;
  8. using Azure;
  9. using Azure.Storage.Sas;
  10. using System.Linq;
  11. using Azure.Storage.Blobs.Specialized;
  12. namespace TEAMModelOS.SDK.Models.Service
  13. {
  14. public class BatchCopyFileService
  15. {
  16. /// <summary>
  17. /// 执行批量复制操作方法
  18. /// </summary>
  19. /// <param name="_dingDing"></param>
  20. /// <param name="_azureStorage"></param>
  21. /// <param name="batchCopyFile"></param>
  22. /// <returns></returns>
  23. public static async Task<int> CopyFile(DingDing _dingDing,AzureStorageFactory _azureStorage, BatchCopyFile batchCopyFile)
  24. {
  25. try
  26. {
  27. List<Task<Response<BlobCopyInfo>>> filelist = new List<Task<Response<BlobCopyInfo>>>();
  28. var azureClient = _azureStorage.GetBlobContainerClient($"{batchCopyFile.blobCntr}");//获取容器连接地址
  29. //先删除原有的文件
  30. List<Task<Response<bool>>> DelList = new List<Task<Response<bool>>>();
  31. await foreach (BlobItem blobItem in azureClient.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"yxpt/{batchCopyFile.newFileName}/"))
  32. {
  33. DelList.Add(azureClient.GetBlobBaseClient(blobItem.Name).DeleteIfExistsAsync());
  34. }
  35. if (DelList.Count <= 256)
  36. {
  37. await Task.WhenAll(DelList);
  38. }
  39. else
  40. {
  41. int pages = (DelList.Count + 255) / 256;
  42. for (int i = 0; i < pages; i++)
  43. {
  44. List<Task<Response<bool>>> delList = DelList.Skip((i) * 256).Take(256).ToList();
  45. await Task.WhenAll(delList);
  46. }
  47. }
  48. //查询目录下所有容器路径
  49. await foreach (BlobItem blobItem in azureClient.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"yxpt/{batchCopyFile.oldFileName}/"))
  50. {
  51. string newurl = $"{blobItem.Name}".Replace($"/{batchCopyFile.oldFileName}/", $"/{batchCopyFile.newFileName}/");//替换成新的容器路径
  52. var urlSas = _azureStorage.GetBlobSAS($"{batchCopyFile.blobCntr}", blobItem.Name, BlobSasPermissions.Read | BlobSasPermissions.List); //获取容器sas和有效期
  53. filelist.Add(azureClient.GetBlobClient(newurl).SyncCopyFromUriAsync(new Uri(urlSas))); //添加复制文件到集合执行复制操作
  54. }
  55. if (filelist.Count <= 256)
  56. {
  57. await Task.WhenAll(filelist);
  58. }
  59. else
  60. {
  61. int pages = (filelist.Count + 255) / 256;
  62. for (int i = 0; i < pages; i++)
  63. {
  64. List<Task<Response<BlobCopyInfo>>> rspBlobCopyInfos = filelist.Skip((i) * 256).Take(256).ToList();
  65. await Task.WhenAll(rspBlobCopyInfos);
  66. }
  67. }
  68. return 200;
  69. }
  70. catch (Exception ex)
  71. {
  72. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-ExamService-saveMore\n{ex.Message}{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  73. return -1;
  74. }
  75. }
  76. }
  77. }