#c# #azure #blob #storage #azure-blob-storage
#c# #azure #большой двоичный объект #Хранение #azure-blob-хранилище
Вопрос:
У меня есть код, который открывает поток для большого двоичного объекта в хранилище для чтения его содержимого (шаги, описанные ниже), большой двоичный объект представляет собой файл Json, который иногда бывает пустым, он отображается на портале Azure с 0B и может быть загружен и открыт.
Я проверяю поток больших двоичных объектов.Свойство длины, позволяющее узнать, пустой это большой двоичный объект или нет для обработки файла, по какой-то причине, независимо от того, пустой файл или нет, свойство длины равно -1, а не 0.
В некоторых местах я читал, что -1 является инициализированным значением свойства и что для обновления метаданных необходимо вызвать FetchAttributesAsync. и я прочитал в документах Microsoft, что вызов OpenReadAsync автоматически вызывает FetchAttributesAsync, упомянутый в этих документах в разделе примечания:
не уверен, что происходит, связана ли проблема с вызовом FetchAttributes или что-то с открытием потока, и почему длина всегда равна -1.
Я использую Azure.Хранение.Большие двоичные объекты, чтобы создать клиент больших двоичных объектов со строкой подключения и вернуть поток больших двоичных объектов для чтения его содержимого
_blobServiceClient = new BlobServiceClient(connectionString);
blobStream = await _blobServiceClient.GetBlobContainerClient(container).GetBlobClient(blobName).OpenReadAsync(cancellationToken: cancellationToken);
в потоке, возвращаемом из OpenReadAsync, мы проверяем длину .. и обрабатываем файл:
if( blobStream.Length == 0 ) continue;
< — длина всегда равна -1
Комментарии:
1. Действительно ли опубликованный вами код соответствует тому, что вы на самом деле используете? Потому что я ожидал бы увидеть
await
где-нибудь.2. Я не копировал прошлое, я написал то, что я сделал в целом, каким-либо образом отредактировал вопрос.
Ответ №1:
Если вы хотите прочитать файл больших двоичных объектов как поток, BlobBaseClient.DownloadTo
метод поможет.
BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
BlobContainerClient container = blobServiceClient.GetBlobContainerClient(containerName);
BlobClient blob = container.GetBlobClient(blobName);
MemoryStream s = new MemoryStream();
blob.DownloadTo(s);
Console.WriteLine(s.Length);
И есть другой способ получить длину содержимого большого двоичного объекта с BlobProperties.ContentLength
помощью .
BlobClient blob = container.GetBlobClient(blobName);
var properties = blob.GetProperties();
Console.WriteLine(properties.Value.ContentLength);
Комментарии:
1. это было полезно, спасибо: D, я пошел другим путем, получив свойства большого двоичного объекта, а затем открыв поток чтения соответствующим образом, если содержимое равно 0 или нет. я также открыл проблему с хранилищем, надеюсь, что get позаботится об этом, если это ошибка.