使用System.IO.Compression强制替换现有文件来提取文件?

40
我正在使用以下代码从文件夹中提取所有文件。

我正在使用以下代码从文件夹中提取所有文件

        using (ZipArchive archive = new ZipArchive(zipStream))
        {
            archive.ExtractToDirectory(location);
        }

但是,如果一个文件已经存在,则会引发异常。有没有办法告诉压缩API替换现有的文件。

我发现一种方法是先获取所有文件名,然后检查文件是否存在并将其删除。但这对我来说有点昂贵。

12个回答

0

看起来唯一避免包含那个代码块的方法就是在使用 del 解压归档文件之前删除文件:

del (location + "\*")
using (ZipArchive archive = new ZipArchive(zipStream))
{
  archive.ExtractToDirectory(location);
}

这不完全是 OP 想要的,但它很紧凑。


0

更好的代码,

不检查目录是否存在(在创建时会自动检查)

零堆分配(而不是使用foreach)

用法

using var stream = someStream;
using var zipArchive = new ZipArchive(stream);
zipArchive.ExtractToDirectoryEx(path);

public static class ZipArchiveExtensions
{
    [SuppressMessage("ReSharper", "ForCanBeConvertedToForeach")]
    public static void ExtractToDirectoryEx(this ZipArchive source, string destinationDirectoryName)
    {
        var entries = source.Entries;
        for (var i = 0; i < entries.Count; i++)
        {
            var entry = entries[i];
            var completeFileName = Path.Combine(destinationDirectoryName, entry.FullName);
            var directory = Path.GetDirectoryName(completeFileName);
            Directory.CreateDirectory(directory);
            if (entry.Name != string.Empty)
            {
                entry.ExtractToFile(completeFileName, overwrite: true);
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接