![](/img/trans.png)
[英]How to use LINQ to get an object from List of objects matching option from List of options
[英]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.