azure - 如何获取刚刚复制到 Azure 存储帐户的 CloudBlockBlob 的大小?

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

我正在将文件从 Azure 文件共享复制到存储容器中的 CloudBlockBlob。我想在删除原始文件之前验证两个位置的字节(.Properties.Length)是否相同。我认为这将是获得对复制的 blob 的新引用的情况,但它始终是 -1。

副本工作正常,对文件 v blob 的目视检查显示字节是相同的,只是不确定如何在我的 C# 应用程序中复制它。

我遇到问题的行是定义“复制”对象的行。

string myfile = @"junk.txt";

CloudFile sourcefile = 
    fileStorage.Share.GetRootDirectoryReference().GetFileReference(myfile);
CloudBlockBlob destBlob = 
     destStorage.Container.GetBlockBlobReference(myfile);
string fileSAS = sourcefile.GetSharedAccessSignature(new 
    SharedAccessFilePolicy()
{
    Permissions = SharedAccessFilePermissions.Read,
    SharedAccessExpiryTime = DateTime.Now.AddHours(24)
});
Uri fileUri = new Uri(sourcefile.StorageUri.PrimaryUri.ToString() + fileSAS);
CloudBlockBlob destBlob = destStorage.Container.GetBlockBlobReference(file.Path);
destBlob.StartCopy(fileUri);
CloudBlockBlob copied = destStorage.Container.GetBlockBlobReference(myfile);

最佳答案

在想要获取属性/元数据之前,您需要先使用FetchAttributes()方法,该方法用于填充属性和元数据。

请尝试以下代码:

    static void Main(string[] args)
    {
        string myfile = "123.txt";
        CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials("account_name", "account_key"), true);

        CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
        CloudFileShare fileShare = fileClient.GetShareReference("test");
        CloudFile sourceFile = fileShare.GetRootDirectoryReference().GetFileReference(myfile);

        sourceFile.FetchAttributes();
        Console.WriteLine("The source file length is: "+sourceFile.Properties.Length);

        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        var container = blobClient.GetContainerReference("aa1");
        CloudBlockBlob destBlob = container.GetBlockBlobReference(myfile);

        string fileSAS = sourceFile.GetSharedAccessSignature(new SharedAccessFilePolicy() {
            Permissions = SharedAccessFilePermissions.Read,
            SharedAccessExpiryTime=DateTime.Now.AddHours(24)
        });

        Uri fileUri = new Uri(sourceFile.StorageUri.PrimaryUri.ToString() + fileSAS);
        Console.WriteLine("--copy started--");
        destBlob.StartCopy(fileUri);            

        destBlob = container.GetBlockBlobReference(myfile);
        destBlob.FetchAttributes();

        //use poll to check if the copy is completed or not.
        while (destBlob.CopyState.Status == CopyStatus.Pending)
        {
            Thread.Sleep(500);
            destBlob.FetchAttributes();
        }

        //when the copy completed, then check the copied file length.
        if (destBlob.CopyState.Status == CopyStatus.Success)
        {
            Console.WriteLine("the dest blob length is: " + destBlob.Properties.Length);
        }
        else
        {
            Console.WriteLine("the copy operation is failed!");
        }


        Console.ReadLine();
    }

测试结果如下:

源文件长度为:184227539

--复制开始--

目标 blob 长度为:184227539

您还可以引用屏幕截图了解更多详细信息。

Text output screenshot

关于azure - 如何获取刚刚复制到 Azure 存储帐户的 CloudBlockBlob 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55482268/

相关文章:

azure - 无法在 azure Active Directory 中创建应用程序 - 权限不足

Azure 通信服务简单 SMS

c# - Azure Blob 存储 - 从 WebApi Controller 将 Http/StreamContent 上传到 CloudBlockBlob

azure - 在 azure devops 门户上查看代码覆盖率报告

Azure 存储非经典 (V2) - 如何配置自定义域

c# - Azure 文件存储似乎无法正常工作 "without code changes"正如微软声称的那样

azure - GetBlockBlobReference 未提供文件夹路径详细信息

c# - CloudBlockBlob.DownloadTextAsync 返回无效文本

azure - 从 Azure Databricks 写入 Azure Blob 存储时重复 Blob 创建的事件

azure - 如何允许在 Azure 租户中公开登录我的应用程序注册?