2017-06-20 6 views
0

すべてのフォルダとその内容をまとめてzipファイルにまとめようとしています。 (StackOverflowとMicrosoftを使用して)調査したところから、Directory.CreateDirectory(Path)は指定されたディレクトリを作成する必要があります。しかし、私のZipFileは空になっています。Directory.CreateDirectory()はZipFile内にフォルダを作成しません

たとえば、サブフォルダ(0001、0002)を含むフォルダ(C:\ Users \ smelmo \ Desktop \ test)があります。 0001内には0002、その他には0002があります。私は0001と0002を一緒にジッパーフォルダ内で圧縮したいと思っています。これは今まで私が持っているものです:

// Open the directory of the target folder 
using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create)) 
{ 
    // Grab each directory within the target folder 
    foreach (var directoryName in Directory.GetDirectories(strStartPath)) 
    { 
     // Add each directory to the ZipFile 
     Directory.CreateDirectory(directoryName); 
    } 
} 

これは何も生成されません。しかし、私はまた、サブフォルダ内のすべてのファイルを取得し、ZipFileに配置するコードを持っています。

// Open the directory of the target folder 
using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create)) 
{ 
    // Grab each directory within the target folder 
    foreach (var directoryName in Directory.GetDirectories(strStartPath)) 
    { 
     //Grab all files in each directory 
     foreach (var filePath in Directory.GetFiles(directoryName)) 
     { 
      var fileName = Path.GetFileName(@filePath); 

      // Place each directory and its repsective files in the zip file 
      var entry = archive.CreateEntryFromFile(filePath, fileName);   
     } 
    } 
} 

しかし、これは単に0001と0002のCONTENTS私は0001と0002とそれぞれの内容を望むのです、それにサブフォルダ0001と0002を配置していません。

+4

'Directory.CreateDirectory' _onlyはsystem_ファイル上で動作するので、すでに存在するディレクトリを再作成しています! [ZipArchiveでのディレクトリの作成](https://stackoverflow.com/questions/15133626/creating-directories-in-a-ziparchive-c-sharp-net-4-5)を参照してください。 – stuartd

答えて

1

編集:

あなたはより多くの制御を探している場合は、あなただけのzipアーカイブにファイルを追加する関数を作成することができます。再帰を使用して、サブフォルダとファイルを追加できます。その後、次のコード使用して、それを呼び出すことができます

public void AddFolderToZip(ZipArchive archive, string rootPath, string path, bool recursive) 
{ 
    foreach (var filePath in Directory.GetFiles(path)) 
    {    
     //Remove root path portion from file path, so entry is relative to root 
     string entryName = filePath.Replace(rootPath, ""); 
     entryName = entryName.StartsWith("\\") ? entryName.Substring(1) : entryName; 

     var entry = archive.CreateEntryFromFile(filePath, entryName); 
    } 

    if (recursive) 
    { 
     foreach (var subPath in Directory.GetDirectories(path)) 
     { 
      AddFolderToZip(archive, rootPath, subPath, recursive); 
     } 
    } 
} 

::あなたがにファイルを追加するzipアーカイブを受け付ける関数定義でき

まず

string strStartPath = @"C:\Test\zip"; 
string strZipPath = @"C:\Test\output.zip"; 
ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create); 
bool recursive = true; 

foreach (var directoryPath in Directory.GetDirectories(strStartPath)) 
{ 
    AddFolderToZip(archive, strStartPath, directoryPath, recursive); 
} 

archive.Dispose(); 

このコードは、各ディレクトリに追加しますトップレベルのディレクトリを検索します。また、見つかったディレクトリごとに再帰を使用して、それらのサブディレクトリまたはファイルを追加します。

+0

これは現在、すべてのファイルをstrStartPathは、ファイルとサブディレクトリの両方を含むディレクトリです。私は、サブディレクトリとそのサブディレクトリ内のファイルをどうやって取得するのか分かりません。 – smelmo

+0

これは素晴らしいことです。したがって、基本的にサブフォルダとその内容を直接圧縮する機能はなく、これを再帰的に実行する唯一の方法はありますか? – smelmo

+0

ええ、私が知っている限り(このライブラリでは)、ZipFile.CreateFromDirectoryを使ってすべてを追加するか、個別にエントリを追加します – Ehz

関連する問題