如何压缩目录的内容除了一个子目录?

ran*_*oon 6 c# zipfile

我正在尝试创建一个zip文件作为目录的备份,并最终将该备份保存在该目录中的"backups"文件夹中.例如,"文件夹"包括"subFolder","file1.txt","file2.txt"和"backups"."backups"文件夹将包含各种早期备份文件.我想创建一个"文件夹"及其所有内容的存档,包括子文件夹,但不包括"备份".

这是我最初想要使用的:

ZipFile.CreateFromDirectory(folderToZip, backupFileName);
Run Code Online (Sandbox Code Playgroud)

我意识到在压缩文件夹中保存zip文件存在问题,因此我打算将其保存在其他地方,然后将其传输.但我不知道如何在没有备份文件夹的情况下轻松创建存档.我唯一的想法是以递归的方式编写我自己的方法遍历目录并排除那个文件夹.似乎必须有一个更简单的方法.

任何帮助将不胜感激!

das*_*ght 10

不幸的是,ZipFile没有提供一种允许您过滤条目的方法.幸运的是,您可以根据此实现轻松创建这样的方法:

public static class ZipHelper {
    public static void CreateFromDirectory(
        string sourceDirectoryName
    ,   string destinationArchiveFileName
    ,   CompressionLevel compressionLevel
    ,   bool includeBaseDirectory
    ,   Encoding entryNameEncoding
    ,   Predicate<string> filter // Add this parameter
    ) {
        if (string.IsNullOrEmpty(sourceDirectoryName)) {
            throw new ArgumentNullException("sourceDirectoryName");
        }
        if (string.IsNullOrEmpty(destinationArchiveFileName)) {
            throw new ArgumentNullException("destinationArchiveFileName");
        }
        var filesToAdd = Directory.GetFiles(sourceDirectoryName, "*", SearchOption.AllDirectories);
        var entryNames = GetEntryNames(filesToAdd, sourceDirectoryName, includeBaseDirectory);
        using(var zipFileStream = new FileStream(destinationArchiveFileName, FileMode.Create)) {
            using (var archive = new ZipArchive(zipFileStream, ZipArchiveMode.Create)) {
                for (int i = 0; i < filesToAdd.Length; i++) {
                    // Add the following condition to do filtering:
                    if (!filter(filesToAdd[i])) {
                        continue;
                    }
                    archive.CreateEntryFromFile(filesToAdd[i], entryNames[i], compressionLevel);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此实现允许您传递拒绝"backup/"目录中所有条目的过滤器:

ZipHelper.CreateFromDirectory(
    myDir, destFile, CompressionLevel.Fastest, true, Encoding.UTF8,
    fileName => !fileName.Contains(@"\backup\")
);
Run Code Online (Sandbox Code Playgroud)

  • @dasblinkenlight 我在这一行 GetEntryNames(filesToAdd, sourceDirectoryName, includeBaseDirectory); 中遇到错误 请给我建议任何东西谢谢。 (2认同)