web-dev-qa-db-ja.com

C#で.net APIのみを使用して複数のファイルを圧縮する方法

Webアプリケーションで動的に作成されている複数のファイルを圧縮するのが好きです。これらのファイルは圧縮する必要があります。このために、サードパーティのツールを使用したくありません。 C#で.net APIを使用したい

30
Partha

。NET 3.0+のSystem.IO.Packaging を使用します。

System.IO.Packagingの概要をご覧ください


.NET 4.5の依存関係を取得できる場合、そのユニバースには System.IO.Compression.ZipArchive があります。 チュートリアル記事はこちらInfoQニュース概要記事はこちら )を参照

43
Ruben Bartelink

.NET Framework 4.5のリリースでは、 System.IO.Compression が追加され、 ZipFileクラス が追加されたため、これは実際には非常に簡単になりました。良い codeguruのウォークスルー ;があります。ただし、基本は次の例に沿っています。

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();
        }
    }
}

30
rjzii

サードパーティのツールを使用したくないということの意味はわかりませんが、別のソフトウェアを介してプログラムでそれを行う厄介な相互運用を望まないことを前提としています。

ICSharpCode SharpZipLib を使用することをお勧めします

これは、参照DLL)としてプロジェクトに追加でき、Zipファイルを作成してそれらを読み取るのはかなり簡単です。

6
cjk

http://www.codeplex.com/DotNetZip ソースコードが利用可能であるため、その実行方法を確認し、自分に似たものを書くことができます。

3
Ray

フラット構造の単純な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への参照を追加する必要があります

2
Tomas Kubes

さて、次の関数を使用してファイルを圧縮し、ファイルバイトを渡すだけで、この関数はパラメーターとして渡されたファイルバイトを圧縮し、圧縮されたファイルバイトを返します。

 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();
2
Talha Hanjra

DotNetZipを使用する方法です(dotnetzip.codeplex.com)。NETパッケージングライブラリを試してはいけません。

1
The Pickle

System.IO.Compression.DeflateStreamを確認してください。 msdnでいくつかの例を見つけることができます http://msdn.Microsoft.com/en-us/library/system.io.compression.deflatestream.aspx

0
Marcom

System.Diagnostics.Processクラスを使用して、適切なコマンドラインで常に7-Zipなどのサードパーティの実行可能ファイルを呼び出すことができます。 OSにバイナリの起動を要求しているだけなので、そのような相互運用性はありません。

0
ajs410