Azure Blob Storage SDK 12 сжатие файлов с помощью GZipStream не работает

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

#c# #azure #.net-ядро #azure-blob-хранилище

Вопрос:

Я все время использую один и тот же код для архивирования потоков одним и тем же способом. Но по какой-то причине это не работает в Azure.Хранение.Большие двоичные объекты версии 12.6.0 lib

         m_currentFileName = Guid.NewGuid()   ".txt.gz";
        var blockBlob = new BlockBlobClient(m_connectionString, m_containerName, GetTempFilePath());

        using (var stream = await blockBlob.OpenWriteAsync(true))
        using (var currentStream = new GZipStream(stream, CompressionMode.Compress))
        using (var writer = new StreamWriter(currentStream))
        {
            writer.WriteLine("Hello world!");
        }
  

После этого я получил файл 0B в хранилище Azure Blob
введите описание изображения здесь

Код без GZipStream работает так, как ожидалось. Я нашел много примеров кода с копированием данных в MemoryStream первым, но я не хочу хранить свои данные в оперативной памяти. Я не обнаружил никаких проблем в StackOverflow или Azure Blob Storage GitHub. Поэтому я могу сделать что-то не так. Есть предложения?

Ответ №1:

Похоже GZipStream , что поток должен быть явно закрыт в соответствии с GZipStream.Write методом

Операция записи может произойти не сразу, а буферизуется до тех пор, пока не будет достигнут размер буфера или пока не будет вызван метод Flush или Close.

Например:

   using (var stream = new MemoryStream())
  {
      using (var gzipStream = new GZipStream(stream, CompressionMode.Compress, true))
      using (var writer = new StreamWriter(gzipStream))
      {
          writer.Write("Hello world!");
      }
      stream.Position = 0;
      await blockBlob.UploadAsync(stream);
  }
  

Комментарии:

1. Спасибо за ответ! Close вызывается в методе Dispose() GZipStream, поэтому использование должно выполнять свою работу. Как я уже писал, я уже нашел несколько решений с MemoryStream, но это обязывает сначала хранить все данные в оперативной памяти и только затем записывать весь поток в blockBlob. Это требует больше времени и памяти, чем просто потоковая передача всех данных через потоки.