簡體   English   中英

如何使用 Azure 存儲 SDK 將 Azure 文件存儲上的文件從一個子文件夾移動到另一個子文件夾?

[英]How to move a file on Azure File Storage from one sub folder to another sub folder using the Azure Storage SDK?

我想弄清楚如何將 Azure 文件存儲中的文件從一個位置移動到同一共享中的另一個位置。

例如

source -> \\Share1\someFile.txt
destination -> \\Share1\Foo\Bar\someFile.txt
  • 我需要先復制文件,然后刪除源嗎?
  • 如果目標子目錄不存在怎么辦? 我是否需要首先為每個子目錄CreateIfNotExistsAsync

干杯!

有關 Azure 存儲文件參考的入門指南對此進行了記錄

您需要的是將文件從一個位置復制到另一個位置的StartCopy方法。

// Start the copy operation.
destinationFile.StartCopy(sourceFile);

而且,是的,如果目標目錄不存在,您將不得不創建它。

像這樣:

public static void MoveTo(this CloudFile source, CloudFileDirectory directory)
{
    var target = directory.GetFileReference(source.Name);
    target.StartCopy(source);
    source.Delete();
}

不幸的是,我們沒有通過客戶端 SDK 所依賴的 REST API 公開的移動/重命名功能。 您當然可以通過 SMB 執行這些功能。 我們的積壓工作中確實有這些功能,但還沒有實施時間表。

Azure 存儲文件共享是與 SMB 兼容的共享。 因此,您應該能夠使用正常的文件 I/O 操作進行文件復制/移動。 這與直接 blob 操作形成對比,在直接 blob 操作中,您需要通過 Storage API 專門創建容器、啟動 blob 副本等。

這是帶有新 blob API 的 Asp.net Core 3+ 的更新答案。 您可以將BlockBlobClientStartCopyFromUriAsync 一起使用,如果您想等待完成WaitForCompletionAsync

var blobServiceClient = new BlobServiceClient("StorageConnectionString");
var containerClient = blobServiceClient.GetBlobContainerClient(container);
var blobs = containerClient.GetBlobs(BlobTraits.None, BlobStates.None, sourceFolder);

await Task.WhenAll(blobs.Select(async blob =>
{
    var targetBlobClient = containerClient.GetBlockBlobClient($"{targetFolder}/{blob.Name}");
    var blobUri = new Uri($"{containerClient.Uri}/{blob.Name}");
    var copyOp = await targetBlobClient.StartCopyFromUriAsync(blobUri);
    return await copyOp.WaitForCompletionAsync();
}).ToArray());

或者,如果您不需要等待完成並且只想“開火並忘記”。

foreach (var blob in blobs)
{
    var targetBlobClient = containerClient.GetBlockBlobClient($"{targetFolder}/{blob.Name}");
    var blobUri = new Uri($"{containerClient.Uri}/{blob.Name}");
    targetBlobClient.StartCopyFromUriAsync(blobUri);
}

Azure blob 子控制器是一項虛擬功能,因為它們實際上並不存在,blob/文件的名稱包含完整路徑。 因此,您不必顯式“創建”目錄。

我不認為 Azure blob/文件存在原子“重命名”方法......要解決它,您必須復制(使用新名稱)然后刪除原始名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM