azure - 在 azure 文件共享和 blob 之间移动文件

标签 azure azure-blob-storage azure-storage-files azure-files

我必须在同一存储帐户上的共享和 Blob 之间移动一些文件。 经过一番谷歌搜索后,我最终得到了这段代码:

CloudFileClient fileClient = account.CreateCloudFileClient();
CloudFileShare share = fileClient.GetShareReference("shareName");
CloudFileDirectory rootDir = share.GetRootDirectoryReference();
CloudFileDirectory videoDirectory = rootDir.GetDirectoryReference(video.StoragePath);
CloudBlobClient blobClient = account.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(video.StoragePath);
container.CreateIfNotExists();

foreach (var Files in videoDirectory.ListFilesAndDirectories())
{
    var arr = Files.Uri.ToString().Split('/');
    string strFileName = arr[arr.Length - 1];
    CloudFile sourceFile = videoDirectory.GetFileReference(strFileName);
    string fileSas = sourceFile.GetSharedAccessSignature(new SharedAccessFilePolicy()
    {
        Permissions = SharedAccessFilePermissions.Read,
        SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24)
    });

    Uri fileSasUri = new Uri(sourceFile.StorageUri.PrimaryUri.ToString() + fileSas);

    CloudBlockBlob blockBlob = container.GetBlockBlobReference(strFileName);
    blockBlob.StartCopyAsync(fileSasUri).Wait();    //copy the file to blob storage and wait for the operation to complete
    //sourceFile.DeleteAsync();    //delete the file  
}
//videoDirectory.DeleteAsync();    //delete the directory

如果删除行未注释,则目标包含源文件夹中的所有文件,但大小为 0。

有什么想法我做错了什么吗?

我还想在所有文件复制完成后删除共享目录。有没有办法检查文件是否在目标文件夹中?

最佳答案

据我所知,云 blob StartCopyAsync 方法意味着您告诉服务器端开始从文件存储中复制 blob。

但它不会等待复制操作执行完毕。

因此,如果您想在文件执行完毕后删除该文件,您应该使用 FetchAttributes 方法来获取 blob 的状态。

如果状态完成,您可以删除该文件。

更多详细信息,您可以引用以下代码:

CloudStorageAccount account = CloudStorageAccount.Parse(
"connection string");
        CloudFileClient fileClient = account.CreateCloudFileClient();

        CloudFileShare share = fileClient.GetShareReference("sharetest");

        CloudFileDirectory rootDir = share.GetRootDirectoryReference();

        CloudFileDirectory videoDirectory = rootDir.GetDirectoryReference("TestDirectory");

        CloudBlobClient blobClient = account.CreateCloudBlobClient();

        CloudBlobContainer container = blobClient.GetContainerReference("testdirectory");

        container.CreateIfNotExists();

        foreach (var Files in videoDirectory.ListFilesAndDirectories())
        {
            var arr = Files.Uri.ToString().Split('/');
            string strFileName = arr[arr.Length - 1];
            CloudFile sourceFile = videoDirectory.GetFileReference(strFileName);
            string fileSas = sourceFile.GetSharedAccessSignature(new SharedAccessFilePolicy()
            {
                Permissions = SharedAccessFilePermissions.Read,
                SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24)
            });

            Uri fileSasUri = new Uri(sourceFile.StorageUri.PrimaryUri.ToString() + fileSas);

            CloudBlockBlob blockBlob = container.GetBlockBlobReference(strFileName);

            blockBlob.StartCopyAsync(fileSasUri).Wait();
            blockBlob.FetchAttributes();
            while (blockBlob.CopyState.Status == CopyStatus.Pending)
            {
                Thread.Sleep(50);
                blockBlob.FetchAttributes();
            }

            if (blockBlob.CopyState.Status == CopyStatus.Success)
            {
                sourceFile.DeleteAsync();
            }

关于azure - 在 azure 文件共享和 blob 之间移动文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42911770/

相关文章:

azure - 如何使用关联功能关联前端调用和 Web API 调用的两个 AI 遥测数据

c# - Azure WebJobs SDK 如何允许将特定参数列表注入(inject)到 Function 方法中?

eclipse - 如何在 azure 中测试我发布的 restful web 服务

Django 将 azure-storage 形式的 blob 返回为可下载文件

c# - 从 Azure Blob 存储返回 PDF 时出现“错误,无法加载 PDF 文档”

asp.net - 如何在 MVC 中提供文件而不暴露 URL?

c# - 如何配置WCF Azure云服务,使其无需离线即可更新?

Blob 中的 Azure ML 工作台文件

azure - “未配置文件端点。”当尝试使用模拟器在azure存储中使用文件客户端时

azure - 我可以通过 unc-path 从我的应用程序服务访问 azure-storage-file 吗?