У меня есть следующий сценарий.
- Функция azure с таймером запуска в плане потребления (это означает 1,5 ГБ ОЗУ)
- , когда таймер попал в пару файлов будут заархивированы и затем загружены в azure blob как CloudAppendBlob напрямую с использованием потока, поэтому никакие данные не должны записываться локально или в память из-за доступных ресурсов.
- в некоторых случаях ранее созданный большой двоичный объект должен открыть снова как поток для вставки других файлов
Текущая проблема Кажется, CloudAppendBlob не поддерживает запись потока с возможностью поиска.
Пример кода:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("connection string");
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("container name");
var appendBlockBlob = container.GetAppendBlobReference("blob to write to");
using (CloudBlobStream blobStream = await appendBlockBlob.OpenWriteAsync(false))
// **here an exception will be thrown because the AppendBlockBlob doensn't support seek that is needed by ZipArchive in update mode**
using (ZipArchive archive = new ZipArchive(blobStream, ZipArchiveMode.Update, true))
{
ZipArchiveEntry entry = archive.CreateEntry("file entry", CompressionLevel.Optimal);
using (Stream stream = entry.Open())
using (var file = File.OpenRead("file to be written to blob"))
{
await file.CopyToAsync(stream);
}
}
Зачем мне это нужно:
, потому что мой код работает в azure функции, которая может быть прервана по любой причине, например, по тайм-ауту. поэтому ранее выполненное не будет потеряно и при следующем запуске будет продолжаться, а не начинаться с Beginning