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