2017-01-02 11 views
1

LINQを使用してZipArchiveからZipArchiveEntryというファイルを選択します。LINQを使用してZipArchiveの中から最初に一致するファイルを取得する方法は?

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

txtInZipは常にnullを返している:私は何

は、これまで

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()) { 
      ... 
     } 
    } 
} 

これは私が問題を抱えていますラインです。私もSelectの代わりにFirstOrDefault

を使用しようとしましたが、ZipArchiveEntryを意図して返すようにこのLINQクエリを修正するにはどうすればよいですか?

答えて

3

ドキュメントから読み取ることができるように、FullNameプロパティにはファイルの相対パスが含まれているため、ファイル名とNameプロパティを比較する必要があります。

にはアイテムがあなたのテストを一致しない場合FirstOrDefaultは[NULL可能オブジェクトに対して] nullを返しますhttps://msdn.microsoft.com/de-de/library/system.io.compression.ziparchiveentry(v=vs.110).aspx

+0

ありがとうございます。私はZipArchiveEntryドキュメントを読んでいて、それを見ませんでした。また、ファイル名には(ジップの名前から) '(A)'があることに気付きましたが、その中のtxtファイルはそれ以外は同じです。私はそれに応じて私のクエリを調整し、今後も '.Name'を使用します。 'Path.GetFileName(x.FullName)'も通常同様に動作しますが、 'x.Name'は自分の必要性のために処理/頭痛が少なくなります。有難うございます ! (upvoted) –

1

参照してください。 archive.Entriesはこれをデバッグするに

「の.txt」のファイル名+に等しいFullNameを持つオブジェクトが含まれていないように何らかの理由で、それが見えますので、

:どこかのブロックを 『使用』でブレークポイントを入れて、デバッガをアタッチし、ブレークポイントがヒットしたら、archive.Entriesにカーソルを置いてアイテムを展開し、FullNamesを見て、なぜそれらが期待したものでないのかを確認します。 であることを他の特性が期待しているかどうかを調べることもできます。 c#==比較では大文字と小文字が区別されることに注意してください。

+0

私はデバッガを使って変数を検査し、ブレークポイントを使用していました(もちろん)。私は気づいていませんでしたが、zipファイルには "(A)"というファイルがあります。トーマスが提供した情報に基づいてフィルタを調整しました。 (upvoted) –

関連する問題