2017-01-02 61 views
1

我想使用LINQ从ZipArchive中选择一个文件作为ZipArchiveEntry如何使用LINQ从ZipArchive中获取第一个匹配的文件?

我有什么到目前为止

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的目的?

回答

3

由于您可以从文档中阅读,因此需要将文件名与Name属性进行比较,因为FullName属性包含该文件的相对路径。

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

+0

谢谢。我正在阅读ZipArchiveEntry文档,但没有看到。还注意到文件名中有一个“(A)”(来自zip的名称),但里面的txt文件除此之外是相同的。我相应地调整了我的查询,并且从现在起也将使用'.Name'。 'Path.GetFileName(x.FullName)'通常也可以工作,但是'x.Name'对于我的需求来说是较少的处理/头痛。谢谢你! (upvoted) –

1

FirstOrDefault将返回null [为空的对象。如果找不到符合您的测试。

所以,不管出于什么原因,它看起来像archive.Entries不包含对象等于文件名+“.TXT”

要调试这样的真实姓名:将断点在某处你的‘使用’块,附加你的调试器,当断点被击中时,将鼠标悬停在archive.Entries上,展开项目并查看FullNames,看看它们为什么不符合你的预期。你也可以看看是否有另一个属性你的预期。请记住,c#==比较区分大小写。

+0

我正在使用调试器来检查变量并使用断点(当然)。我没有注意到,但zip文件有一个“(A)”,里面的文件没有。还根据Thomas提供的信息调整我的过滤器。 (upvoted) –

相关问题