Как определить, отличается ли Azure Blob от текущего файла (C # / .Net Core)?

#c# #azure #file #.net-core #azure-blob-storage

#c# #azure #файл #.net-core #azure-blob-хранилище

Вопрос:

Я хочу загрузить файл в хранилище больших двоичных объектов Azure только в том случае, если большой двоичный объект, который он будет перезаписывать (файл больших двоичных объектов), отличается от текущего файла (загружаемого).

Есть ли у кого-нибудь какие-либо предложения по этой функциональности с использованием C # / .Net Core?

Ответ №1:

Есть несколько способов сделать это в зависимости от того, что вы можете сделать с текущим файлом.

  1. Самый простой способ — просто загрузить файл, не беспокоясь о том, изменится он или нет. Если это то же самое, оно останется, если нет, оно будет заменено новой версией.

Исходя из вашего вопроса, это, вероятно, не вариант для вас. Следующее, что нужно проверить, — это свойства больших двоичных объектов. Вы можете разрешить хранилищу больших двоичных объектов использовать значения по умолчанию или переопределить их при загрузке большого двоичного объекта.

Вы можете взглянуть на них на портале, и они будут выглядеть примерно так:

 LAST MODIFIED   11/20/2020, 1:28:22 PM
CREATION TIME   7/31/2019, 11:44:55 AM
VERSION ID  -
TYPE    Block blob
SIZE    64 B
ACCESS TIER N/A
ACCESS TIER LAST MODIFIED   N/A
SERVER ENCRYPTED    true
ETAG    0x8D88D820FE0B5E4
CONTENT-TYPE    application/octet-stream
CONTENT-MD5 vfS7mlI8PCeeG2yXyUQ25A==
LEASE STATUS    Unlocked
LEASE STATE Available
 

Чтобы получить их в C #, выполните BlobProperties properties = await blob.GetPropertiesAsync();

  1. Если ваш новый файл — это существующий файл правки, то свойства LastModified может быть достаточно, чтобы определить, отличаются ли они.
  2. MD5-хэш существующего и нового файла также является хорошим выбором для сравнения. Хэши не являются строго уникальными, но обычно они достаточно уникальны, чтобы определить, был ли изменен файл.
  3. Если вы контролируете создание большого двоичного объекта, а также его обновление, у вас также есть возможность задать пользовательские свойства для большого двоичного объекта. Это позволило бы вам установить что-то в большом двоичном объекте, что вы могли бы отслеживать, чтобы увидеть, изменилось ли содержимое. Тот же GetPropertiesAsync() метод извлекает словарь метаданных, и его настройка выполняется путем создания Dictionary<string, string> и передачи его в blob.SetMetadataAsync(metadata);
  4. Абсолютным наихудшим случаем была бы загрузка существующего большого двоичного объекта и выполнение сравнения двух документов. Если бы не было какой-то причины, по которой я должен был это сделать, если бы 2-4 не сработали для меня, я бы выбрал первый вариант и использовал его только в крайнем случае.