Как получить размер CloudBlockBlob, который я только что скопировал в учетную запись хранения Azure? - PullRequest
0 голосов
/ 02 апреля 2019

Я копирую файлы из общих папок 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);

1 Ответ

1 голос
/ 03 апреля 2019

Прежде чем вы хотите получить свойство / метаданные, вам сначала нужно использовать метод 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-объекта dest: 184227539

Вы также можете обратиться к скриншоту для получения более подробной информации.

Text output screenshot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...