2012-11-28 25 views
0

我必須列出一個zip文件(FileName,lenght,創建日期,修改等)內的所有可用信息。一些我必須分析的zip文件帶有文件夾和zip文件以及其他文件類型。我如何閱讀更多的信息ZipEntry(s)內使用sharpZipLibrary ZipEntry?

我想知道如何閱讀這些文件夾和內容的zip文件的內部,也ZIP文件的zip條目,而無需解壓整個事情(如果它甚至有可能)

如:

Collection.zip FILE1.TXT FILE2.TXT 報告/ REPORT1.TXT REPORT2.TXT first-backup.zip second-backup.zip

以敏銳的拉鍊庫我能夠做讀取文件的第一層:

foreach (Zip_Library.Zip.ZipEntry entry in new Zip_Library.Zip.ZipFile(fi.FullName)) 
{ 
    printObjectProps(entry); 
} 

而且printObjectProps看起來有點像這樣:

private static void printObjectProps(Object obj) 
    { 
     Console.WriteLine("--------------------------------------------"); 
     Console.WriteLine("ObjectType:" + obj.GetType().ToString()); 
     Console.WriteLine("--------------------------------------------"); 
     foreach (PropertyInfo propInfo in obj.GetType().GetProperties()) 
     { 
      Console.WriteLine("PropertyName:" + propInfo.Name); 
      Console.WriteLine("PropertyType:" + propInfo.PropertyType); 
      Console.WriteLine("PropertyValue:" + propInfo.GetValue(obj, null)); 
      Console.WriteLine(); 
     } 
     Console.WriteLine("--------------------------------------------"); 
    } 

之前,我自己,我應該考慮任何想法陷入更多麻煩?

回答

1

DotNetZip會給你想要的東西:

http://dotnetzip.codeplex.com/

很容易和簡單易用。列出一個zip文件目錄:

using (ZipFile zip = ZipFile.Read(ExistingZipFile)) 
{ 
    foreach (ZipEntry e in zip) 
    { 
    if (header) 
    { 
     System.Console.WriteLine("Zipfile: {0}", zip.Name); 
     if ((zip.Comment != null) && (zip.Comment != "")) 
     System.Console.WriteLine("Comment: {0}", zip.Comment); 
     System.Console.WriteLine("\n{1,-22} {2,8} {3,5} {4,8} {5,3} {0}", "Filename", "Modified", "Size", "Ratio", "Packed", "pw?"); 
     System.Console.WriteLine(new System.String('-', 72)); 
     header = false; 
    } 
     System.Console.WriteLine("{1,-22} {2,8} {3,5:F0}% {4,8} {5,3} {0}", e.FileName, e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"), e.UncompressedSize, e.CompressionRatio, e.CompressedSize, (e.UsesEncryption) ? "Y" : "N"); 
    } 
} 

沒有被壓縮。它只是尋找文件的末尾,然後向後尋找目錄/清單,然後讀取它。

如果你發現一個條目本身是一個壓縮文件,而你想探索的是,它很容易提取,作爲一個臨時文件和遞歸下降到探索它,但如果我沒記錯的話,你可以

+1

但是,如果壓縮文件A包含壓縮文件B,那麼在不從A中提取B的內容的情況下無法閱讀,是嗎? – phoog

+0

@phoog。 AFAIK,這將是正確的。但是,如果我沒有記錯的話,DotNetZip允許您將文件提取到MemoryStream。此外,當存儲在zip存檔中時,已壓縮的文件不會再次被壓縮:這會導致文件大小擴大。該算法檢測壓縮文件並將其存儲,而不進行[進一步]壓縮。 –

+0

感謝您的洞察力。希望其他人可以確認'zip B'將在解壓縮後被讀取或放入內存中,以便我們可以檢查其中的文件。 – mimoralea