значение свойства длины потока больших двоичных объектов всегда -1, независимо от того, пустой файл или нет

#c# #azure #blob #storage #azure-blob-storage

#c# #azure #большой двоичный объект #Хранение #azure-blob-хранилище

Вопрос:

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

Я проверяю поток больших двоичных объектов.Свойство длины, позволяющее узнать, пустой это большой двоичный объект или нет для обработки файла, по какой-то причине, независимо от того, пустой файл или нет, свойство длины равно -1, а не 0.

В некоторых местах я читал, что -1 является инициализированным значением свойства и что для обновления метаданных необходимо вызвать FetchAttributesAsync. и я прочитал в документах Microsoft, что вызов OpenReadAsync автоматически вызывает FetchAttributesAsync, упомянутый в этих документах в разделе примечания:

OpenReadAsyncDocs

FetchAttributesAsyncDocs

не уверен, что происходит, связана ли проблема с вызовом 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 позаботится об этом, если это ошибка.