2016-09-01 19 views
0

タイトルには、ジップ内にジップを作成しようとしています。ZipArchiveクラスを使用してC#でアーカイブ内にアーカイブを作成します

私は上記の「TargetFilePath」

var projectDirectoryPath = currentProjectViewModel.DirectoryPath; 
ZipFile.CreateFromDirectory(projectDirectoryPath, [email protected]"/Project.zip"); 

という変数で作成されたzipアーカイブをcパスので、私は想定しています、動作しません持っている:\ test.zip \ project.zipが有効ではありませんパス。

編集のために:私は文字通りいくつかのファイルを圧縮し、別のアーカイブの中にそのジッパーを配置したいと思います。それは、System.IO.Compressionを使用している必要があります。サードパーティのメソッドはありません。私の理解から

あなたはzipファイルのターゲットアドレスを作成する必要があり、そして、また、私の経験から、そのターゲットアドレスは、「C:\ test.zip \ project.zip」として無効なパスすることはできません

+0

再帰呼び出しは多分ですか? –

+1

'projectDirectoryPath'に.zipファイル+その他のファイルがある場合は、それだけで動作します。既に.zipファイルがあり、そのファイルにzipファイルを追加する場合は、[this](https://msdn.microsoft.com/en-us/library/hh158346(v=vs.110).aspx )それを行う一つの方法ですが、それは私の痛みのように見えます。私はちょうど内側のzipファイルを作成してから、zipを作成してもう一方のファイルを追加するのではなく、zipファイルを作成します。その他のオプションについては、[こちら](https://msdn.microsoft.com/en-us/library/system.io.compression.zipfile(v = vs.110).aspx)を参照してください。 – Quantic

+1

また、既存のzipファイルをディレクトリに抽出し、もう一方のzipファイルをコピーして、同じコマンドを使用してそのフォルダを圧縮してください。私はこれを言うが[ZipArchive.CreateEntry](https://msdn.microsoft.com/en-us/library/hh158346(v=vs.110).aspx)はちょうど「このファイルをzipに変換するには、何らかの形でファイルをストリームしなければなりません。あなたがリソースを持っているならば、人生を楽にするためにいくつかのIOと時間を使ってください。 – Quantic

答えて

2

最も簡単な方法は、projectDirectoryPathの内容を含む一時ファイルにzipファイルを作成し、それが完了したらそのファイルをターゲットのzipアーカイブに追加することです。

だから、基本的にこのような何か:私はzipアーカイブがすでに圧縮され、圧縮の別の層がそれに何も値を追加しませんので、あなたがCompressionLevel.NoCompressionを使用することをお勧め

var projectDirectoryPath = currentProjectViewModel.DirectoryPath; 
var tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 
try 
{ 
    ZipFile.CreateFromDirectory(projectDirectoryPath, tempFile); 

    using (var archive = ZipFile.Open(TargetFilePath, ZipArchiveMode.Update)) 
    { 
     archive.CreateEntryFromFile(tempFile, "Project.zip", CompressionLevel.NoCompression); 
    } 
} 
finally 
{ 
    System.IO.File.Delete(tempFile); 
} 

。アーカイブを開くときにZipArchiveMode.Updateを使用することは、zipファイルが実際に変更されるように重要です。この列挙子の他の値は、最初から新しいアーカイブを作成したり、読み取り専用として開くために使用されます。

この例では、私はCreateEntryFromFile機能を使用しました。これは拡張メソッドなので、using宣言に名前空間があることを確認してください。

一時ファイルを必要としないようにこれを実装することは可能ですが、新しいZIPファイルを自分で作成し、作成するときにストリームに直接書き込む必要があるため、もっと多くのコードが必要になります。 achiveの新しいエントリ。しかし、ほとんどの場合、私が与えた例は仕事をするべきです。

+0

このメソッドを使用すると、一時ファイルが既に存在するという例外が発生します –

+0

修正済みです。今では、ちょうど一時ファイルを生成するためにかなり安全な方法を使用しています。ファイル名が既に使用されている場合、これは失敗する可能性があります。これが確実に動作するようにするには、空きのファイル名が得られるまでループして、ファイルがすでに使用されているかどうかをチェックする必要があります。 – Nitram

+0

http://pastebin.com/HyEdu0Smこのコードでも同じエラーが発生しています。私は変数の値を調べることができ、 "fileExists"はfalseを返すので、これは動作すると仮定します。 –

関連する問題