簡體   English   中英

如何使用 LINQ 從 ZipArchive 中獲取第一個匹配文件?

[英]How to use LINQ to get the first matching file from inside a ZipArchive?

我想選擇一個文件作為ZipArchiveEntry從內ZipArchive使用LINQ。

到目前為止我所擁有的

string filename = "foo";
using ( FileStream zipFile = new FileStream( Path.Combine( FilePathLocal, filename + ".zip" ), FileMode.Open ) ) {
    using ( ZipArchive archive = new ZipArchive( zipFile, ZipArchiveMode.Read ) ) {
        var txtInZip = archive.Entries.Select( x => x.FullName == filename + ".txt" );
        using ( Stream csvStream = txtInZip.Open() ) {
            ...
        }
    }
}

這是我遇到問題的線路:

var txtInZip = archive.Entries.FirstOrDefault( x => x.FullName == filename + ".txt" );

txtInZip總是返回 null。 我也嘗試使用Select代替FirstOrDefault

我需要做什么來更正這個 LINQ 查詢,以便它按預期返回 ZipArchiveEntry?

正如您從文檔中看到的,您需要將文件名與 Name 屬性進行比較,因為 FullName 屬性包含文件的相對路徑。

請參閱https://msdn.microsoft.com/de-de/library/system.io.compression.ziparchiveentry(v=vs.110).aspx

如果沒有項目與您的測試匹配,則 FirstOrDefault 將返回 null [for nullable objects]。

因此,無論出於何種原因,看起來 archive.Entries 不包含 FullName 等於 filename + ".txt" 的對象

調試這個:在你的“using”塊中的某個地方放置一個斷點,附加你的調試器,當斷點被擊中時,將鼠標懸停在archive.Entries上,展開項目並查看FullNames,看看為什么它們不是你所期望的. 您還可以看看是否有另一種屬性,你所期望的。 請記住,c# == 比較區分大小寫。

我有以下代碼可以從 zip 文件中的所有文件中遞歸讀取所有文件名,包括內部 zip 文件:

List<ZipArchive> Archives = new List<ZipArchive>();

void outputFileNames(string file)
{
    using (var fileStream = System.IO.File.Open(file, System.IO.FileMode.Open))
    {
        var parentArchive = new ZipArchive(fileStream);
        Archives.Add(parentArchive);
        foreach (ZipArchiveEntry entry in parentArchive.Entries)
        {
            if (Path.GetExtension(entry.Name).Equals(".zip"))
            {
                addArchivesToList(new ZipArchive(entry.Open()));
            }
        }

        foreach (var archive in Archives)
        {
            foreach (var e in archive.Entries)
            {
                Console.WriteLine("Filename: " + e.Name);
            }
        }
    }
}

void addArchivesToList(ZipArchive archive)
{
    Archives.Add(archive);
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        if (Path.GetExtension(entry.Name).Equals(".zip"))
        {
            addArchivesToList(new ZipArchive(entry.Open()));
        }
    }
}

一旦在該部分中找到第一個匹配項,您就可以實現退出條件:

foreach (var e in archive.Entries)
{
   Console.WriteLine("Filename: " + e.Name);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM