logo头像

Edward.K Thinking

Azure Blob 將檔案從一個Container搬移到另一個Container

通常要搬移 Azure Blob 間的檔案,最快方式就是透過AzCopy工具將檔案在不同 Blob Account 或是 Blob Container 間移動。但是,有些情境下卻不能只用 AzCopy,通常我認為會用到這工具的時候就是在整批檔案搬移到另一個 Container,中間不會有其他需要邏輯判斷或是要分散檔案的情境。如果,有其他邏輯就單純用這工具指令就無法使用,還必須搭配使用 PowerShell 才有辦法完成。但如果不會用 PowerShell,也可以透過 Blob SDK 用 C#來做到


先設定連線字串,連線到Blob Account

1
2
string connsctionString2 = "連接字串";
var cloudStorage = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(connsctionString2);

找尋檔案被放在哪一個Container裡面

1
2
CloudBlobClient _cloudBlobClient2 = cloudStorage.CreateCloudBlobClient();
var cloudBlobContainer = _cloudBlobClient2.GetContainerReference("Container Name");

列出所有的File,如果檔案不是在Container裡面,還多幾個階層的話,就需要在prefix設定,舉例來說檔案前面還有兩個階層,則prefix : 'A/B/',如果沒有,就設定空字串

1
2
var blobs = cloudBlobContainer.ListBlobs(prefix: "", useFlatBlobListing: true);
var res = new List<string>();

上面為檔案的來源端,再設定要搬移檔案的目的端Container位置

1
var cloudBlobContainer2 = _cloudBlobClient2.GetContainerReference("Container Name 2");

然後,就透過blobs把所有檔案都取出來,邊取出的時候,就邊做搬移動作,而在目的端存放的檔案資料夾結構為:

存在Container Name 2下面,並且用時間做分類的第一個資料夾,在時間資料夾內再用類型區分檔案

((CloudBlob)blob).Name主要是取出的 Blob 的檔案名稱,作為目的端的檔案名稱,雖然,說是檔案搬移,但實際上它的運作,是先將來源端的檔案複製一份到目的端,然後再去把來源端的檔案給刪除,如果,你要來源端與目的端檔案名稱不同,就可以用其他規則取代掉((CloudBlob)blob).Name

1
2
3
4
foreach (var blob in blobs)
{
copyfile("時間", "Type Name", ((CloudBlob)blob).Name, cloudBlobContainer2, ((CloudBlockBlob) blob));
}

使用StartCopy進行檔案複製,再用Delete刪除來源端的檔案,雖然,在 Blob 中看起來是用資料夾區分檔案,對應到 URL,就是/,,,/,,,,/File Name

1
2
3
4
5
6
private void copyfile(string date, string type, string fileName, CloudBlobContainer cloudBlobContainer2, CloudBlockBlob cloudBlock)
{
var targetBlob = cloudBlobContainer2.GetBlockBlobReference($"Container Name 2/{date}/{type}/{fileName}");
targetBlob.StartCopy(cloudBlock);
cloudBlock.Delete();
}

藉由 SDK,也可以輕鬆做到 Blob 檔案搬移,以上是在相同 Blob Account,如果不是相同 Blob Account,就必須再多一個 cloudBlobClient,並設定其他連線位置了