2016-06-19 10 views
-2

この質問にはJavaライブラリ(Read a zip file inside zip file)を使用して回答がありますが、 c#またはvb.net。別のzipファイル内のzipファイルのzipエントリを読む方法、c#またはvb.netのadause、

私がクライアントに対して行う必要があるのは、.NET 4.5 ZipArchiveライブラリを使用して特定のエントリのzipファイルをトラバースすることです。誰かが尋ねる前に、クライアントはdotnetzipの使用を拒否します。これは、彼のチーフアーキテクトがそのライブラリの経験があり、実際のアプリケーションで使用するにはあまりにもバギーだと言います。彼は私にカップルを指摘しています、とにかく私が何を考えているかは重要ではありません!

私はzipファイルを持っていて、それ自体が他のzipファイルを含んでいます。内側のzipファイルを開き、そのzipファイルのエントリを読む必要があります。最終的には、実際にはzip内のzipエントリを実際に開く必要がありますが、今のところ、内側のzipファイルのzipentriesを取得する必要があります。

ここで私がこれまで持っているものです。

public string PassThruZipFilter(string[] sfilters, string sfile, bool buseregexp, bool bignorecase, List<ZipArchiveZipFile> alzips) 
{ 
    bool bpassed = true; 
    bool bfound = false; 
    bool berror = false; 
    string spassed = ""; 
    int ifile = 0; 
    try 
    { 
    ZipArchive oarchive = null; ; 
    int izipfiles = 0; 
    if (alzips.Count == 0) 
    { 
     oarchive = ZipFile.OpenRead(sfile); 
     izipfiles = oarchive.Entries.Count; 
    } 
    else 
    { 
     //need to dig into zipfile n times in alzips[i] where n = alzips.Count 
     oarchive = GetNthZipFileEntries(alzips, sfile); <------ NEED TO CREATE THIS FUNCTION! 
     izipfiles = oarchive.Entries.Count; 
    } 
    while (((ifile < izipfiles) & (bfound == false))) 
    { 
     string sfilename = ""; 
     sfilename = oarchive.Entries[ifile].Name; 
     //need to take into account zip files that contain zip files... 
     bfound = PassThruFilter(sfilters, sfilename, buseregexp, bignorecase); 
     if ((bfound == false) && (IsZipFile(sfilename))) 
     { 
     //add this to the zip stack 
     ZipArchiveZipFile ozazp = new ZipArchiveZipFile(alzips.Count, sfile, sfilename); 
     alzips.Add(ozazp); 
     spassed = PassThruZipFilter(sfilters, sfilename, buseregexp, bignorecase, alzips); 
     if (spassed.Equals(sISTRUE)) 
     { 
      bfound = true; 
     } 
     else 
     { 
      if (spassed.Equals(sISFALSE)) 
      { 
      bfound = false; 
      } 
      else 
      { 
      bfound = false; 
      berror = true; 
      } 
     } 
     } 
     ifile += 1; 
    } 
    } 
    catch (Exception oziperror) 
    { 
    berror = true; 
    spassed = oziperror.Message; 
    } 
    if ((bfound == false)) 
    { 
    bpassed = false; 
    } 
    else 
    { 
    bpassed = true; 
    } 
    if (berror == false) 
    { 
    spassed = bpassed.ToString(); 
    } 
    return (spassed); 
} 

だから私は作成する必要があります関数はZipFileZipEntryがちょうどint型のインデックスを含む構造、文字列szipfileは「GetNthZipFileEntries(リスト、SFILE)」であります、文字列szipentry。

私はzipファイル内のzipファイルを読み込む方法を見つけ出すことはできません使用して(またはGdを、ZIPファイル内のzipファイル内のzipファイルを禁じる...「PassThruZipFilterは再帰関数の内部機能です) .NET 4.5。エクスプローラーでzipファイルの中にzipファイルを開くことができるので、明らかにmicrosoftはそれを行います。助けることができる人のために多くのおかげです。

だから、私は本当にディスクに書き込むことなく、.NET 4.5でのzipファイルの内部のzipファイルを開く方法についてのあなたの助けを必要としています。私はこの特定の目的のために見つけることができるWeb上の例はありません。私はzipファイルのエントリを読むための例がたくさんありますが、それは役に立ちません。 クリアするには、何かを書き込むためにハードディスクを使用することはできません。私はメモリストリームを使うことができますが、それは私ができることの範囲です。 私はdotnetzipライブラリを使用することはできませんので、それを使用しているコメントは役に立たないでしょうが、もちろん私は助けてくれてありがとうございます。 Sharp zipライブラリのような別のライブラリを使うこともできますが、.NET 4.5では不可能であることをクライアントに納得させる必要があります。

+0

Private Sub Test() Using strm As Stream = File.Open("Textfile.zip", FileMode.Open) ListZipEntries(strm) End Using End Sub Private Sub ListZipEntries(strm As Stream) Using archive As New ZipArchive(strm, ZipArchiveMode.Read, False) ' closes stream when done For Each entry As ZipArchiveEntry In archive.Entries Debug.Print(entry.FullName) Dim fi As New FileInfo(entry.FullName) If String.Equals(fi.Extension, ".zip", StringComparison.InvariantCultureIgnoreCase) Then Debug.IndentLevel += 1 Using entryStream As Stream = entry.Open() ListZipEntries(entryStream) End Using Debug.IndentLevel -= 1 End If Next End Using End Sub 
FWIW:[ZipStorer(https://zipstorer.codeplex.com/)まだオプション(単一の.csファイル、無DEPS、MS-PL)かもしれない - それは直接ストリームを扱うことができます。 OTOH、それは太陽の下のすべての機能をサポートしていません.. – user2864740

+0

私は何年もjavaをやったように私はjavaの例を翻訳することができることを追加したいと思いますが、ZIpの.NET VERSIONは行います入力ストリームへのアクセスを提供していません。これは、インターフェイスでの非常にばかげた省略です。私はZipArthを持つ能力を持っていますが、ZipEntryでは基本的に私を途中で去っていませんが、決してそこにいません。 – aaava

+0

ありがとうございます。ええ、私は他のライブラリのいくつかに精通していますが、クライアントは固体であることを知っているライブラリを望んでいることを断言しています。真夜中に働かないことについて電話をしたくない。ですから、別のライブラリを使用することは、長い戦いです... ASP.NETソリューションは私を自由にします! – aaava

答えて

0

ZipArchiveEntryをZipfileとして指定すると、Openメソッドを呼び出してStreamを取得できます。そのストリームを使用して新しいZipArchiveを作成することができます。

次のコードは、ネストされたZipアーカイブのすべてのエントリとサブエントリをリストしています。

+0

ありがとうございます。正確には私が望んでいたものではありませんが、私はentry.Openをストリームとして使うことができます。それはトリックを行うだろう... – aaava

関連する問題