2013-02-10 21 views
15

私はフォルダSystem.IO.Compressionを使用してファイルを抽出する際に、既存のファイルを強制的に置き換える?

 using (ZipArchive archive = new ZipArchive(zipStream)) 
     { 
      archive.ExtractToDirectory(location); 
     } 

内のすべてのファイルを抽出するために、次のコードを使用しています。しかし、一つのファイルには、それが例外をスローし、その後存在する場合。既存のファイルを置き換えるようにCompression APIに指示する方法はありますか?

すべてのファイル名を最初に取得し、ファイルが存在するかどうかを確認して削除する方法が見つかりました。しかし、これはどういうわけか私のために非常に高価です。

答えて

37

私は拡張を作成しました。

public static class ZipArchiveExtensions 
{ 
    public static void ExtractToDirectory(this ZipArchive archive, string destinationDirectoryName, bool overwrite) 
    { 
     if (!overwrite) 
     { 
      archive.ExtractToDirectory(destinationDirectoryName); 
      return; 
     } 
     foreach (ZipArchiveEntry file in archive.Entries) 
     { 
      string completeFileName = Path.Combine(destinationDirectoryName, file.FullName); 
      if (file.Name == "") 
      {// Assuming Empty for Directory 
       Directory.CreateDirectory(Path.GetDirectoryName(completeFileName)); 
       continue; 
      } 
      file.ExtractToFile(completeFileName, true); 
     } 
    } 
} 
+0

これは魅力的です。 – Ravia

+0

これはZipFile組み込みクラスを使って可能ですか? – Pedro77

2

あなたが、私はそれが完璧なソリューションではないことを知っているが、この方法であなた 「File.Copy」とのファイルがコピー先のディレクトリへの真の

ovverideオプションを指定してコピーし、いくつかの一時ディレクトリにと比べてファイルを抽出することができます必要がない ファイルが存在するか確認してください。

+0

私はこのヒントも私の心に持っていますが、私にとっては非常に高価です。 – user960567

+0

他のフレームワークを使用していることを除いて、他の選択肢がないと思います –

11

このコードは、フォルダを作成するのではなく、フォルダが存在しない場合は例外をスローしません。

public static class ZipArchiveExtensions 
{ 
    public static void ExtractToDirectory(this ZipArchive archive, string destinationDirectoryName, bool overwrite) 
    { 
     if (!overwrite) 
     { 
      archive.ExtractToDirectory(destinationDirectoryName); 
      return; 
     } 
     foreach (ZipArchiveEntry file in archive.Entries) 
     { 
      string completeFileName = Path.Combine(destinationDirectoryName, file.FullName); 
      string directory = Path.GetDirectoryName(completeFileName); 

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

      if (file.Name != "") 
       file.ExtractToFile(completeFileName, true); 
     } 
    } 
} 
+3

はコピー猫ではありません – FrostyFire

+2

JABFreeware、@ user960567は "それを改善するコメントは高く評価されます"と言っています。私は例外を投げるのを防ぐためにいくつかの行を追加します! if(!Directory.Exists(directory)) Directory.CreateDirectory(directory); – Mohy66

+0

Coooommmmmmmmeennnnnnntは答えません。あなたがコメントした場合、彼は通知を受けてコードを編集できます:) – FrostyFire

関連する問題