2009-06-21 5 views
47

Zipファイルを解凍するには、C#の組み込みライブラリ/ APIのように見えます。私はzipファイルを解凍して特定のフォルダにすべてのファイルを抽出するために.Net 3.5 + VSTS 2008 + C#で動作する無料の(より良いオープンソースの)ライブラリ/ APIを探しています。は、C#でファイルを解凍するライブラリ/ APIをお勧めします

おすすめのライブラリ/ APIまたはサンプルはありますか?

答えて

34

GPL

http://www.icsharpcode.net/OpenSource/SharpZipLib/

以下の制限のMs-PL

http://www.codeplex.com/DotNetZip

.NET Frameworkが、私はそれであまり成功を収めてZipPackageを持ってこの答えを完了します。

+1

同様に.Netには実装が組み込まれていますが、その作業が不可能なのは –

+0

です。最初は気に入っています。 .Netの場合は、どのクラスですか? – George2

+0

なぜNet ZipPackageの成功率は低いですか? – George2

2

あなたは7-ZIP圧縮を使用する場合は、ピーターBrombergのEggheadCafe articleをチェックしてください。注意:C#のLZMA source codeにはxmlコメントはありません(実際にはコメントはほとんどありません)。

16

DotNetZipは使いやすいです。あなたが抽出するためにエントリかを選択ピックアンドたいようにあなたは、より多くの複雑なニーズを持っている場合、またはパスワードが存在する場合、またはあなたが抽出されたファイルのパス名を制御したい場合はここで解凍サンプル

using (var zip = Ionic.Zip.ZipFile.Read("archive.zip")) 
{ 
    zip.ExtractAll("unpack-directory"); 
} 

です、etc ...など、多くのオプションがあります。より多くの例についてはCheck the help fileを参照してください。

DotNetZipは無料でオープンソースです。

9

以前は、DotNetZip(MS-PL)、SharpZipLib(GPL)、7ZIP SDK for C#(パブリックドメイン)を使用していました。彼らはすべて素晴らしい仕事をしており、オープンソースです。

私はこのような状況でDotNetZipを選ぶだろう、とここC# Examples pageからいくつかのサンプルコードです:

using (ZipFile zip = ZipFile.Read(ExistingZipFile)) 
{ 
    foreach (ZipEntry e in zip) 
    { 
    e.Extract(TargetDirectory); 
    } 
} 
+1

GPPLではなくLGPL - 違いはかなり大きいです。 –

+0

@Quandaryどちらか?彼らのウェブサイトによると、SharpZipLibはGPLです。 –

+0

GPLは例外です(プロジェクトと静的または動的にリンクするのはGPLの下での作業ではありません)= LGPL(OK、静的にリンクする権限はLGPLにないため、静的リンクは珍しい.NETの場合)。率直に言って、LGPLのよりリベラルなバージョンです。 –

4

にサンプルコードを見つけてください、私に見てください小さな図書館:http://zipstorer.codeplex.com

+1

これは実際には最高の答えです! –

23

ファイルの内容をフォルダに解凍し、Windowsでのみ実行することがわかっている場合は、Windowsシェルオブジェクトを使用できます。この例ではFramework 4.0のdynamicを使用しましたが、Type.InvokeMemberを使用しても同じ結果が得られます。

dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application")); 

dynamic compressedFolderContents = shellApplication.NameSpace(sourceFile).Items; 
dynamic destinationFolder = shellApplication.NameSpace(destinationPath); 

destinationFolder.CopyHere(compressedFolderContents); 

あなたはCopyHereメソッドの動作を制御するためにFILEOP_FLAGSを使用することができます。

+1

この古くからの疑問に対して、今までにない最も素晴らしい答えです。これには大きなメリットが必要です。 – Joshua

+1

私は@ジョシュアムに同意する必要があります... – dda

1

外部コンポーネントを使用したくない場合は、.NETのZipPackageクラスを使用して昨夜開発したコードを次に示します。注意すべき

private static void Unzip() 
{ 
    var zipFilePath = "c:\\myfile.zip"; 
    var tempFolderPath = "c:\\unzipped"; 

    using (Package pkg = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read)) 
    { 
     foreach (PackagePart part in pkg.GetParts()) 
     { 
      var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/'))); 
      var targetDir = target.Remove(target.LastIndexOf('\\')); 

      if (!Directory.Exists(targetDir)) 
       Directory.CreateDirectory(targetDir); 

      using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read)) 
      { 
       CopyStream(source, File.OpenWrite(target)); 
      } 
     } 
    } 
} 

private static void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[4096]; 
    int read; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, read); 
    } 
} 

もの:

  • ZIPアーカイブには、そのルートに[CONTENT_TYPES]の.xmlファイルを持たなければなりません。このコードで抽出されたZIPファイルの圧縮を制御するので、これは私の要件にとっては問題ではありませんでした。 [Content_Types] .xmlファイルの詳細については、http://msdn.microsoft.com/en-us/magazine/cc163372.aspxを参照してください。記事の図13の下にサンプルファイルがあります。

  • 私が元々Stream.CopyTo()メソッドを使用してこれを.NET 4.0用に開発したので、CopyStreamメソッドが正しく動作するようにはテストしていません。

1
#region CreateZipFile 
    public void StartZip(string directory, string zipfile_path) 
    { 
     Label1.Text = "Please wait, taking backup"; 
      #region Taking files from root Folder 
       string[] filenames = Directory.GetFiles(directory); 

       // path which the zip file built in 
       ZipOutputStream p = new ZipOutputStream(File.Create(zipfile_path)); 
       foreach (string filename in filenames) 
       { 
        FileStream fs = File.OpenRead(filename); 
        byte[] buffer = new byte[fs.Length]; 
        fs.Read(buffer, 0, buffer.Length); 
        ZipEntry entry = new ZipEntry(filename); 
        p.PutNextEntry(entry); 
        p.Write(buffer, 0 , buffer.Length); 
        fs.Close(); 
       } 
      #endregion 

      string dirName= string.Empty; 
      #region Taking folders from root folder 
       DirectoryInfo[] DI = new DirectoryInfo(directory).GetDirectories("*.*", SearchOption.AllDirectories); 
       foreach (DirectoryInfo D1 in DI) 
       { 

        // the directory you need to zip 
        filenames = Directory.GetFiles(D1.FullName); 
        if (D1.ToString() == "backup") 
        { 
         filenames = null; 
         continue; 
        } 
        if (dirName == string.Empty) 
        { 
         if (D1.ToString() == "updates" || (D1.Parent).ToString() == "updates" || (D1.Parent).Parent.ToString() == "updates" || ((D1.Parent).Parent).Parent.ToString() == "updates" || (((D1.Parent).Parent).Parent).ToString() == "updates" || ((((D1.Parent).Parent).Parent)).ToString() == "updates") 
         { 
          dirName = D1.ToString(); 
          filenames = null; 
          continue; 
         } 
        } 
        else 
        { 
         if (D1.ToString() == dirName) ; 
        } 
        foreach (string filename in filenames) 
        { 
         FileStream fs = File.OpenRead(filename); 
         byte[] buffer = new byte[fs.Length]; 
         fs.Read(buffer, 0, buffer.Length); 
         ZipEntry entry = new ZipEntry(filename); 
         p.PutNextEntry(entry); 
         p.Write(buffer, 0, buffer.Length); 
         fs.Close(); 
        } 
        filenames = null; 
       } 
       p.SetLevel(5); 
       p.Finish(); 
       p.Close(); 
      #endregion 
    } 
    #endregion 

    #region EXTRACT THE ZIP FILE 
    public bool UnZipFile(string InputPathOfZipFile, string FileName) 
    { 
     bool ret = true; 
     Label1.Text = "Please wait, extracting downloaded file"; 
     string zipDirectory = string.Empty; 
     try 
     { 
      #region If Folder already exist Delete it 
      if (Directory.Exists(Server.MapPath("~/updates/" + FileName))) // server data field 
      { 
       String[] files = Directory.GetFiles(Server.MapPath("~/updates/" + FileName));//server data field 
       foreach (var file in files) 
        File.Delete(file); 
       Directory.Delete(Server.MapPath("~/updates/" + FileName), true);//server data field 
      } 
      #endregion 


      if (File.Exists(InputPathOfZipFile)) 
      { 
       string baseDirectory = Path.GetDirectoryName(InputPathOfZipFile); 

       using (ZipInputStream ZipStream = new 

       ZipInputStream(File.OpenRead(InputPathOfZipFile))) 
       { 
        ZipEntry theEntry; 
        while ((theEntry = ZipStream.GetNextEntry()) != null) 
        { 
         if (theEntry.IsFile) 
         { 
          if (theEntry.Name != "") 
          { 
           string directoryName = theEntry.Name.Substring(theEntry.Name.IndexOf(FileName)); // server data field 

           string[] DirectorySplit = directoryName.Split('\\'); 
           for (int i = 0; i < DirectorySplit.Length - 1; i++) 
           { 
            if (zipDirectory != null || zipDirectory != "") 
             zipDirectory = zipDirectory + @"\" + DirectorySplit[i]; 
            else 
             zipDirectory = zipDirectory + DirectorySplit[i]; 
           } 
           string first = Server.MapPath("~/updates") + @"\" + zipDirectory; 
           if (!Directory.Exists(first)) 
            Directory.CreateDirectory(first); 


           string strNewFile = @"" + baseDirectory + @"\" + directoryName; 


           if (File.Exists(strNewFile)) 
           { 
            continue; 
           } 
           zipDirectory = string.Empty; 

           using (FileStream streamWriter = File.Create(strNewFile)) 
           { 
            int size = 2048; 
            byte[] data = new byte[2048]; 
            while (true) 
            { 
             size = ZipStream.Read(data, 0, data.Length); 
             if (size > 0) 
              streamWriter.Write(data, 0, size); 
             else 
              break; 
            } 
            streamWriter.Close(); 
           } 
          } 
         } 
         else if (theEntry.IsDirectory) 
         { 
          string strNewDirectory = @"" + baseDirectory + @"\" + 

          theEntry.Name; 
          if (!Directory.Exists(strNewDirectory)) 
          { 
           Directory.CreateDirectory(strNewDirectory); 
          } 
         } 
        } 
        ZipStream.Close(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      ret = false; 
     } 
     return ret; 
    } 
    #endregion 
0

SevenZipSharpは、オープンソース、無料でthaの7z.dllとLZMA SDK、ラッパです。

SevenZipCompressor compressor = new SevenZipCompressor(); 
compressor.CompressionLevel = CompressionLevel.Ultra; 
compressor.CompressionMethod = CompressionMethod.Lzma; 
compressor.CompressionMode = CompressionMode.Create; 
compressor.CompressFiles(...); 
関連する問題