gpt4 book ai didi

c# - 如何压缩一个目录的内容,除了一个子目录?

转载 作者:太空狗 更新时间:2023-10-29 21:08:15 25 4
gpt4 key购买 nike

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

这是我最初想使用的:

ZipFile.CreateFromDirectory(folderToZip, backupFileName);

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

如有任何帮助,我们将不胜感激!

最佳答案

不幸的是,ZipFile 没有提供过滤条目的方法。幸运的是,您可以根据 this implementation 轻松创建这样的方法。 :

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);
}
}
}
}
}

此实现允许您传递一个过滤器,该过滤器拒绝来自 "backup/" 目录的所有条目:

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

关于c# - 如何压缩一个目录的内容,除了一个子目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35415936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com