不幸的是,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\")
);
我會用'Directory.EnumerateFiles'和'foreach'循環,除非我確保永遠不會有包含大量文件的目錄。 – Haukinger
@Haukinger我也會這樣做,但我決定繼續實施,以接近原始,以說明爲了實現OP的要求,需要改變的很少。 – dasblinkenlight
謝謝你的幫助!我很感激! – randomraccoon