Как заархивировать несколько файлов, используя только .net api в С#

Мне нравится архивировать несколько файлов, которые динамически создаются в моем веб-приложении. Эти файлы должны быть заархивированы. Для этого я не хочу использовать какие-либо сторонние инструменты. так же, как использовать .net API в С#


person Partha    schedule 07.08.2009    source источник


Ответы (8)


С выпуском .NET Framework 4.5 это стало намного проще благодаря обновлениям System.IO.Compression, который добавляет файл класс ZipFile. Существует хорошее пошаговое руководство по кодгуру; однако основы соответствуют следующему примеру:

using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.IO.Compression.FileSystem;

namespace ZipFileCreator
{
    public static class ZipFileCreator
    {
        /// <summary>
        /// Create a ZIP file of the files provided.
        /// </summary>
        /// <param name="fileName">The full path and name to store the ZIP file at.</param>
        /// <param name="files">The list of files to be added.</param>
        public static void CreateZipFile(string fileName, IEnumerable<string> files)
        {
            // Create and open a new ZIP file
            var zip = ZipFile.Open(fileName, ZipArchiveMode.Create);
            foreach (var file in files)
            {
                // Add the entry for each file
                zip.CreateEntryFromFile(file, Path.GetFileName(file), CompressionLevel.Optimal);
            }
            // Dispose of the object when we are done
            zip.Dispose();
        }
    }
}

person rjzii    schedule 15.01.2015
comment
Как мне это сделать при получении данных файлов (BLOB) из базы данных? - person Seth; 04.05.2015
comment
@ Сет, тебе, вероятно, понадобится выполнить ввод-вывод. Десериализуйте большой двоичный объект обратно в байты, запишите байты в файл, а затем передайте полный путь к этому методу как один из файлов в IEnumerable<string> files - person Kris Coleman; 21.09.2017
comment
@Seth Положи это внутрь foreach var entry = zip.CreateEntry(file), CompressionLevel.Optimal); using (Stream dbStream = getStreamFromDB(file)) using (Stream entryStream = entry.Open()) { dbStream.CopyToAsync(entryStream); } - person sirdank; 07.03.2019

Используйте System.IO.Packaging в .NET 3.0+. .

См. это введение в System.IO.Packaging


Если вы можете использовать зависимость от .NET 4.5, есть System.IO.Compression.ZipArchive в этом юниверсе; см. пошаговое руководство статья здесь (через сводку новостей InfoQ здесь)

person Ruben Bartelink    schedule 07.08.2009
comment
Просто примечание: это самый уродливый API для архивирования. - person Cheeso; 08.08.2009

Простой zip-файл с плоской структурой:

using System.IO;
using System.IO.Compression;

private static void CreateZipFile(IEnumerable<FileInfo> files, string archiveName)
{
    using (var stream = File.OpenWrite(archiveName))
    using (ZipArchive archive = new ZipArchive(stream, System.IO.Compression.ZipArchiveMode.Create))
    {
         foreach (var item in files)
         {
             archive.CreateEntryFromFile(item.FullName, item.Name, CompressionLevel.Optimal);                       
         }
     }
}

Вам нужно добавить ссылку на System.IO.Compression и System.IO.Compression.FileSystem.

person Tomas Kubes    schedule 09.03.2018

Я не уверен, что вы имеете в виду, не желая использовать сторонние инструменты, но я предполагаю, что вы не хотите, чтобы какое-то неприятное взаимодействие программно выполняло это через другое программное обеспечение.

Я рекомендую использовать ICSharpCode SharpZipLib.

Это может быть добавлено в ваш проект в качестве эталонной DLL, и это довольно просто для создания ZIP-файлов и их чтения.

person cjk    schedule 07.08.2009
comment
SharpZipLib хорош (+1), но теперь вы можете сделать это изначально в .Net - см. ответ @Ruben Bartelink - person Keith; 07.08.2009
comment
@Keith - только если вы перешли на .Net 3.0+ - person cjk; 07.08.2009
comment
Он не исключил .NET 3, и это вряд ли так важно, как принудительный переход с .NET 1.1 на 2.0. Хотя SharpZipLib — прекрасная библиотека, которая активно используется (включая меня) - person Ruben Bartelink; 07.08.2009
comment
@Ruben - очевидно, ваш ответ очень правильный (+1), но переход с 2.0 на 3.0+ касается не только технических изменений, но и всей бюрократии, связанной с лицензированием и т. д. - person cjk; 07.08.2009
comment
@ck: Не знаю, какое лицензирование вы имеете в виду, но, конечно же, вы не хотите жить без System.Core :P (Моя главная мысль заключалась в том, что спрашивающий специально не исключал .NET 3.0, а шумел в сторону желая использовать только материалы MS) - person Ruben Bartelink; 07.08.2009
comment
@Ruben - для лицензирования я имею в виду переход на Visual Studio 2008 во всех наших средах разработки. - person cjk; 07.08.2009
comment
@ck - .NET 3.0 - это просто обновление платформы, вам не нужен VS2008, чтобы использовать его достоинства. - person Kev; 07.08.2009
comment
@Kev - моя машина разработки исправлена ​​​​до версии 3.5, как мне использовать изменения 3.0 в VS 2005? - person cjk; 07.08.2009
comment
@ck - следуйте инструкциям Эрика Моро по ссылке Рубена. Все, что вам нужно сделать, это добавить ссылку на сборку WindowsBase. В VS2005 работает нормально. - person Kev; 11.08.2009
comment
И это самая уродливая модель программирования для ZIP-файлов. - person Cheeso; 22.10.2009

Ну, вы можете заархивировать файлы, используя следующую функцию, вам нужно просто передать байты файла, и эта функция заархивирует байты файла, переданные в качестве параметра, и вернет байты заархивированного файла.

 public static byte[] PackageDocsAsZip(byte[] fileBytesTobeZipped, string packageFileName)
{
    try
    {
        string parentSourceLoc2Zip = @"C:\UploadedDocs\SG-ACA OCI Packages";
        if (Directory.Exists(parentSourceLoc2Zip) == false)
        {
            Directory.CreateDirectory(parentSourceLoc2Zip);
        }

        //if destination folder already exists then delete it
        string sourceLoc2Zip = string.Format(@"{0}\{1}", parentSourceLoc2Zip, packageFileName);
        if (Directory.Exists(sourceLoc2Zip) == true)
        {
            Directory.Delete(sourceLoc2Zip, true);
        }
        Directory.CreateDirectory(sourceLoc2Zip);

  

             FilePath = string.Format(@"{0}\{1}",
                    sourceLoc2Zip,
                    "filename.extension");//e-g report.xlsx , report.docx according to exported file

             File.WriteAllBytes(FilePath, fileBytesTobeZipped);




        //if zip already exists then delete it
        if (File.Exists(sourceLoc2Zip + ".zip"))
        {
            File.Delete(sourceLoc2Zip + ".zip");
        }

        //now zip the source location
        ZipFile.CreateFromDirectory(sourceLoc2Zip, sourceLoc2Zip + ".zip", System.IO.Compression.CompressionLevel.Optimal, true);

        return File.ReadAllBytes(sourceLoc2Zip + ".zip");
    }
    catch
    {
        throw;
    }
}

Теперь, если вы хотите экспортировать эти zip-байты, созданные для загрузки пользователем, вы можете вызвать эту функцию, используя следующие строки:

    Response.Clear();
    Response.AddHeader("content-disposition", "attachment; filename=Report.zip");
    Response.ContentType = "application/zip";
    Response.BinaryWrite(PackageDocsAsZip(fileBytesToBeExported ,"TemporaryFolderName"));
    Response.End();
person Talha Hanjra    schedule 14.05.2015

Вы всегда можете вызвать сторонний исполняемый файл, такой как 7-zip, с соответствующей командной строкой, используя класс System.Diagnostics.Process. Таким образом, нет взаимодействия, потому что вы просто просите ОС запустить двоичный файл.

person ajs410    schedule 15.10.2009

DotNetZip - это то, что нужно (dotnetzip.codeplex.com) ... не пытайтесь использовать библиотеку .NET Packaging ... слишком сложную в использовании, и меня беспокоит [Content_Types].xml, который она туда помещает.

person The Pickle    schedule 30.08.2012

Ознакомьтесь с System.IO.Compression.DeflateStream. Связанная страница документации также предлагает пример.

person Marcom    schedule 07.08.2009
comment
Deflate — это не ZIP. Есть еще GZipStream, но это тоже не ZIP. - person Ray; 07.08.2009
comment
верно, но вы все равно можете сжимать несколько файлов вместе для отправки. Сарати попросил что-то встроенное в .net. И это одна вещь, которую предлагает .net - person Marcom; 07.08.2009