Как распаковать самораспаковывающиеся файлы Zip в хранилище BLOB-объектов Azure?

У меня есть zip-файл (.Exe — самораспаковывающийся zip-файл), который можно распаковать с помощью 7zip. Поскольку я хочу автоматизировать процесс извлечения, я использовал приведенный ниже код C#. Он работает для обычных файлов 7z. Но столкнулся с этой проблемой «Не удается получить доступ к закрытому потоку», когда я пытаюсь извлечь определенный самораспаковывающийся (.Exe) zip-файл. К вашему сведению. Вручную я убедился, что версия командной строки 7zip распаковывает файл.

      using (SevenZipExtractor extract = new SevenZipExtractor(zipFileMemoryStream))
    {
        foreach (ArchiveFileInfo archiveFileInfo in extract.ArchiveFileData)
        {
            if (!archiveFileInfo.IsDirectory)
            {
                using (var memory = new MemoryStream())
                {
                    string shortFileName = Path.GetFileName(archiveFileInfo.FileName);
                    extract.ExtractFile(archiveFileInfo.Index, memory);
                    byte[] content = memory.ToArray();
                    file = new MemoryStream(content);
                }
            }
        }
    }

ZIP-файл находится в хранилище BLOB-объектов Azure. Я не знаю, как получить извлеченные файлы в хранилище BLOB-объектов.

1 ответ

Вот один из обходных путей, который сработал для меня. Вместо 7Zip я использовал ZipArchive.

      ZipArchive archive = new ZipArchive(myBlob);
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(destinationStorage);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(destinationContainer);

foreach(ZipArchiveEntry entry in archive.Entries) {
  log.LogInformation($"Now processing {entry.FullName}");

  string valideName = Regex.Replace(entry.Name, @ "[^a-zA-Z0-9\-]", "-").ToLower();

  CloudBlockBlob blockBlob = container.GetBlockBlobReference(valideName);
  using(var fileStream = entry.Open()) {
    await blockBlob.UploadFromStreamAsync(fileStream);
  }
}

СПРАВКА: Как автоматически разархивировать файлы с помощью функции Azure v2

Другие вопросы по тегам