如何使用DotNetZip检查Zip文件中是否存在文件

6

我正在使用dotnetzip库创建zip文件。

但是我不知道如何检查zip中是否存在一个文件。如果该文件存在,则我将使用路径更新该文件。

    public void makezip(string flname)
   {
      string  fln =flname;
        string curFile = @"d:\crs.zip";
        if (File.Exists(curFile))
        {
                ZipFile zipfl = ZipFile.Read(@"D:\crs.zip");
            var result = zipfl.Any(entry => entry.FileName.EndsWith(@fln));
            if (result == true) {
                zipfl.UpdateFile(@fln);
                }else{
                  zipfl.AddFile(@fln);
                }
            zipfl.Save(@"d:\crs.zip");
        }
        else
        {
            try
            {
                ZipFile zipfl = new ZipFile();

                var result = zipfl.Any(entry => entry.FileName.EndsWith(@fln));
                if (result == true)
                {
                  zipfl.AddFile(@fln);
                }
                zipfl.Save(@"d:\crs.zip");
            }catch {
                MessageBox.Show("Invalid Zip File");

            }}}

代码已添加,我正在尝试实现。 - chetan
哪个具体的例子是错误的? - cuongle
我正在通过循环调用此函数,并传递带路径的文件名。我收到了错误消息“已经添加了具有相同键的项”。 - chetan
你能否调试并展示出现了哪种情况,我无法像这样猜测? - cuongle
2个回答

14

如何检查zip文件中是否存在某个文件?

只需使用 LINQ 的Any方法,假设您有输入的 zip 文件input.zip,要检查input.zip是否包含input.txt

 var zipFile = ZipFile.Read(@"C:\input.zip");
 var result = zipFile.Any(entry => entry.FileName.EndsWith("input.txt"));

1
+1;不过需要注意的是,如果我没记错的话,FileEntry.FileName 可能包含(部分)目录路径,请参见这里 - Anders Gustafsson
@AndersGustafsson:谢谢,我已经运行了这段代码,它没有包含目录路径。 - cuongle
如何检查文件是否具有文件夹信息,例如c:\ ab \ input.txt? - chetan
谢谢您的回复,我已经根据此更改了我的代码。但是我无法使用路径搜索文件。 - chetan
1
zipFile.Any(entry => entry.FileName.Equals(directory + @"/" + "input.txt"))将会使用目录信息进行搜索,因为您可能有一个与相同名称或以“input.txt”结尾的不同名称的文件,而您的代码将认为它已经被添加。 - pengibot

6

(这不是dotnetzip,但可以完成工作)

要求:using System.IO.Compression;

程序集:System.IO.Compression.FileSystem.dll

public static bool ZipHasFile(string fileFullName, string zipFullPath)
{
    using (ZipArchive archive = ZipFile.OpenRead(zipFullPath))  //safer than accepted answer
    {
        foreach (ZipArchiveEntry entry in archive.Entries)
        {
            if (entry.FullName.EndsWith(fileFullName, StringComparison.OrdinalIgnoreCase))
            {
                return true;
            }
        }
    }
    return false;
}

示例调用:var exists = ZipHelper.ZipHasFile(@"zipTest.txt", @"C:\Users\...\Desktop\zipTest.zip");

该函数检查名为“zipTest.txt”的文件是否存在于位于“C:\ Users \ ... \ Desktop \ zipTest.zip”位置的ZIP存档中。如果存在,则返回true;否则,返回false。


注意解压使用 Mac 压缩的文件。那些 .zips 可能包含一个子目录 "_MACOSX"。我通过首先测试是否包含 "_MACOSX" 并继续来忽略它们。 - J. Horn

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