Directory.CreateDirectory() 不在 ZipFile 中创建文件夹

Posted

技术标签:

【中文标题】Directory.CreateDirectory() 不在 ZipFile 中创建文件夹【英文标题】:Directory.CreateDirectory() does not create folder within ZipFile 【发布时间】:2017-06-20 15:55:40 【问题描述】:

我正在尝试将所有文​​件夹及其内容压缩到一个 zip 文件中。根据我的研究(通过 *** 和 Microsoft), Directory.CreateDirectory(Path) 应该创建给定的目录。但是,我的 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 以及它们各自的内容。

【问题讨论】:

Directory.CreateDirectory 仅适用于文件系统,因此您正在重新创建已经存在的目录!见Creating Directories in a ZipArchive 【参考方案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();

此代码将它找到的每个目录添加到***目录中。对于它找到的每个目录,它将使用递归来添加在其中找到的任何子目录或文件。

【讨论】:

这是当前从 strStartPath 获取所有文件,这是一个包含文件和子目录的目录。我似乎无法弄清楚如何只获取子目录和子目录中的文件。 这很棒。所以基本上没有函数可以直接压缩子文件夹及其内容,使递归成为实现这一目标的唯一方法? 是的,据我所知(对于这个库),要么使用 ZipFile.CreateFromDirectory 添加所有内容,要么单独添加条目

以上是关于Directory.CreateDirectory() 不在 ZipFile 中创建文件夹的主要内容,如果未能解决你的问题,请参考以下文章

使用System.IO.Directory.CreateDirectory()时出现FileNotFoundException

UWP Directory.CreateDirectory 中的 UnauthorizedAccessException

System.IO.Directory.CreateDirectory - 有史以来最奇怪的异常

Directory.CreateDirectory 在共享主机上抛出 UnauthorizedAccessException 的可能原因

使用 System.IO.Directory.CreateDirectory 在网络驱动器中创建一个文件夹 [重复]

32.Directory类