Как заархивировать несколько файлов, используя только .net API в C # - PullRequest
30 голосов
/ 07 августа 2009

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

Ответы [ 9 ]

43 голосов
/ 07 августа 2009
29 голосов
/ 15 января 2015

С выпуском .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();
        }
    }
}

6 голосов
/ 07 августа 2009

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

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

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

3 голосов
/ 07 августа 2009

http://www.codeplex.com/DotNetZip Исходные коды доступны, поэтому вы можете увидеть, как они это делают, и написать что-то похожее для себя

2 голосов
/ 09 марта 2018

Простой почтовый файл с плоской структурой:

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

2 голосов
/ 14 мая 2015

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

 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();
1 голос
/ 30 августа 2012

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

0 голосов
/ 15 октября 2009

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

0 голосов
/ 07 августа 2009

Проверьте System.IO.Compression.DeflateStream. Вы найдете несколько примеров на MSDN http://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream.aspx

...