10

我试图弄清楚如何将 Azure 文件存储中的文件从一个位置移动到另一个位置,在同一个共享中。

例如

source -> \\Share1\someFile.txt
destination -> \\Share1\Foo\Bar\someFile.txt
  • 我需要先复制文件,然后删除源吗?
  • 如果目标子目录不存在怎么办?我需要首先CreateIfNotExistsAsync为每个子目录吗?

干杯!

4

6 回答 6

9

这在 Azure 存储文件参考的入门指南中有记录。

您需要的是StartCopy将文件从一个位置复制到另一个位置的方法。

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

而且,是的,如果目标目录不存在,您将不得不创建它。

于 2016-09-19T16:27:02.850 回答
6

像这样:

public static void MoveTo(this CloudFile source, CloudFileDirectory directory)
{
    var target = directory.GetFileReference(source.Name);
    target.StartCopy(source);
    source.Delete();
}
于 2019-02-22T01:15:42.503 回答
3

不幸的是,我们没有通过客户端 SDK 所依赖的 REST API 公开移动/重命名功能。您当然可以通过 SMB 执行这些功能。我们的积压工作中确实有这些功能,但还没有实施时间表。

于 2016-09-20T16:20:55.927 回答
2

这是带有新 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);
}
于 2020-06-05T18:55:11.333 回答
1

Azure 存储文件共享是与 SMB 兼容的共享。因此,您应该能够通过正常的文件 I/O 操作进行文件复制/移动。这与直接 blob 操作形成对比,您需要通过存储 API 专门创建容器、启动 blob 副本等。

于 2016-09-19T14:08:29.660 回答
-2

Azure blob 子控制器是一项虚拟功能,因为它们实际上并不存在,blob/文件的名称包含完整路径。因此,您不必显式“创建”目录。

我不认为 Azure blob/文件存在原子“重命名”方法......要解决它,您必须复制(使用新名称)然后删除原始文件。

于 2016-09-19T14:12:16.520 回答