【问题标题】:When Copying then Deleting an Azure File, will the delete always start after the copy has completed?复制然后删除 Azure 文件时,删除是否总是在复制完成后开始?
【发布时间】:2017-07-21 19:47:30
【问题描述】:

我正在尝试重命名 Azure 文件。 为此,我们必须先复制然后删除(因为没有重命名 API)。

鉴于此代码,DELETE 是否总是在复制完成后开始?

await destinationCloudFile.StartCopyAsync(sourceCloudFile);
await sourceCloudFile.DeleteAsync();

我很困惑,因为 StartCopyAsyc 中的 Start 一词......就像......它将开始复制或其他东西......

另外,我没有做 Task.WhenAll(both those tasks) ... 我认为会同时尝试做这些。

重要编辑:这是一个重命名,因此实际上,它将复制新文件就在原始文件旁边:相同的共享、相同的容器、相同的目录.. 当然,都在同一个存储帐户中。

干杯!

【问题讨论】:

标签: c# .net azure azure-storage-files


【解决方案1】:

如果您只是重命名文件,那么您使用的代码应该可以正常工作。重命名本质上是在同一共享/目录中复制文件,然后删除。该复制操作是同步的。


但是,如果您要跨存储帐户复制文件,则复制操作是异步的,您必须等待复制操作完成,然后才能对源文件采取任何进一步的操作(例如您想要执行 move操作)

以下代码执行完毕且没有任何错误时的异步复制操作:

await destinationCloudFile.StartCopyAsync(sourceCloudFile); 

这意味着您复制 blob 的请求已被存储服务接受并已排队。通常复制速度很快,但无法保证。

您需要做的是定期检查复制操作是否已完成。这可以通过获取目标文件的属性来检查复制操作状态。

出于某种原因,我认为这会在存储客户端库中公开(我检查了版本 7.0.0)但它不存在 :(。但是您可以通过 Get File Properties REST API 获取此信息。您可以检查x-ms-copy-status 响应标头(pendingsuccessabortedfailed)。

编辑:在存储客户端 sdk(8.1.4 版)上有一个属性 CopyState,您可以检查副本的状态

【讨论】:

  • 嗨@gaurav - 我实际上是在同一个容器+目录中将一个文件从test.txt重命名为test.txt.lock
  • 那么它将是同步的。对不起,应该更仔细地阅读这个问题:)。
  • 抱歉 - 我应该明确声明。
  • 你做了...第一行:I'm trying to rename an Azure File :)。无论如何,我已经更新了我的答案。我将异步部分留在那里,以防有人试图跨存储帐户移动文件。
  • 太棒了!所以这意味着我不必担心:) 仍然感觉很奇怪.. 我得到了我的'请你复制这个'结果的价值.. 与......'现在复制这个'。
猜你喜欢
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
相关资源
最近更新 更多