2017-06-20 56 views
0

我想将所有文件夹及其内容压缩到一个zip文件中。从我研究过的(通过StackOverflow和Microsoft),Directory.CreateDirectory(Path)应该创建给定的目录。但是,我的ZipFile显示为空。Directory.CreateDirectory()不在ZipFile中创建文件夹

例如,我有一个文件夹(C:\ Users \ smelmo \ Desktop \ test),其中包含子文件夹(0001,0002)。其他文件在0001和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,只是我想0001和0002的0001和0002的内容和它们各自的内容。

+4

'Directory.CreateDirectory' _只适用于文件system_,因此您正在重新创建已存在的目录!请参阅[在ZipArchive中创建目录](https://stackoverflow.com/questions/15133626/creating-directories-in-a-ziparchive-c-sharp-net-4-5) – stuartd

回答

1

编辑:

如果您正在寻找更多的控制,你可以创建一个功能,增加了文件到一个zip压缩文件。然后,您可以使用递归来添加任何子文件夹和文件。

首先,你可以定义接受一个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); 
     } 
    } 
} 

然后你可以使用下面的代码调用它:

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