Создать Zip-файл с несколькими файлами C # - PullRequest
0 голосов
/ 25 октября 2018

Я создаю Zip-файл из файлов, загружаемых из Интернета, в байтах [], но у меня есть проблема, я не знаю, что я делаю неправильно ... Я генерирую Zip-файл, ноповрежден, размер файла правильный (не 0).Не могли бы вы мне помочь, пожалуйста?Может быть, я не очень хорошо поняла.

public <ActionResult> SomeFunction()
{
    var invoices = GetInvoices();
    WebClient client = new WebClient();
    byte[] zipBytes = null;

    using (var compressedFileStream = new MemoryStream())
    {
        using (ZipArchive zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Create, leaveOpen: true))
        {
            foreach (var invoice in invoices)
            {
                // This has correct values.
                byte[] fileBytes = client.DownloadData(invoice.XmlUri);

                // Create the instance of the file.
                var zipEntry = zipArchive.CreateEntry(invoice.XmlFileName);

                // Get the stream of the file.
                using (var entryStream = new MemoryStream(fileBytes))

                // Get the Stream of the zipEntry
                using (var zipEntryStream = zipEntry.Open())
                {
                    // Adding the file to the zip file.
                    entryStream.CopyTo(zipEntryStream);
                }
            }
        }
        zipBytes = compressedFileStream.ToArray();
    }
    return File(zipBytes , System.Net.Mime.MediaTypeNames.Application.Octet, "test.zip");
}

1 Ответ

0 голосов
/ 25 октября 2018

Переместить

zipBytes = compressedFileStream.ToArray();

К после размещения архива, чтобы все данные были сброшены в основной поток.

public <ActionResult> SomeFunction() {
    var invoices = GetInvoices();
    WebClient client = new WebClient();
    byte[] zipBytes = null;

    using (var compressedFileStream = new MemoryStream()) {
        using (ZipArchive zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Create, leaveOpen: true)) {
            foreach (var invoice in invoices) {
                // This has correct values.
                byte[] fileBytes = client.DownloadData(invoice.XmlUri);

                // Create the instance of the file.
                var zipEntry = zipArchive.CreateEntry(invoice.XmlFileName);

                // Get the stream of the file.
                using (var entryStream = new MemoryStream(fileBytes))

                // Get the Stream of the zipEntry
                using (var zipEntryStream = zipEntry.Open()) {
                    // Adding the file to the zip file.
                    entryStream.CopyTo(zipEntryStream);
                }
            }            
        }
        zipBytes = compressedFileStream.ToArray();
    }
    return File(zipBytes , System.Net.Mime.MediaTypeNames.Application.Octet, "test.zip");
}

Ссылка ZipArchive.Dispose ()

Этот метод завершает запись архива и освобождает все ресурсы, используемые объектом ZipArchive.Если вы не сконструируете объект с помощью перегрузки конструктора ZipArchive(Stream, ZipArchiveMode, Boolean) и не установите для его параметра leaveOpen значение true, все базовые потоки будут закрыты и больше не будут доступны для последующих операций записи.

Когда вы закончите использовать этот экземпляр ZipArchive, позвоните Dispose(), чтобы освободить все ресурсы, используемые этим экземпляром.Вам следует исключить дальнейшие ссылки на этот экземпляр ZipArchive, чтобы сборщик мусора мог восстановить память экземпляра, а не сохранять ее для завершения.

...