2012-01-14 232 views
3

我正在尋找一種方法將嵌入式資源添加到我的解決方案中。這些資源將是其中包含大量文件的文件夾。根據用戶需求,他們需要進行解壓縮。使用C#解壓縮tar文件

我正在尋找一種方法來存儲可執行文件中的這種文件夾,而不涉及第三方庫(看起來相當愚蠢,但這是任務)。

我發現,我可以使用標準庫進行GZip和UnGZip。但是GZip只處理單個文件。在這種情況下,TAR應該趕到現場。但是我還沒有在標準類中找到TAR的實現。

也許有可能使用裸C#解壓縮TAR?

回答

2

由於您不允許使用外部庫,因此您不限於tar文件的特定格式。事實上,他們甚至不需要它們都在同一個文件中。

您可以在C#中編寫自己的類tar實用程序來遍歷目錄樹,並生成兩個文件:一個「header」文件,包含一個映射到偏移量/長度對的序列化字典,以及一個大包含連接成一個巨型blob的單個文件內容的文件。這不是一項微不足道的任務,但也不是太複雜。

4

tar-cs

using (FileStream unarchFile = File.OpenRead(tarfile)) 
{ 
    TarReader reader = new TarReader(unarchFile); 
    reader.ReadToEnd("out_dir"); 
} 
0

有2種方式來壓縮/ .NET中解壓縮第一,你可以使用Gzipstream類DeflatStream雙方因此,如果你在壓縮的任何文件可以真正地在壓縮格式名爲.gz文件Gzipstream可以使用任何流行的壓縮應用程序打開,例如winzip/winrar,7zip,但是無法使用DeflatStream打開壓縮文件。這兩個類都來自.NET 2.

還有另一種方法是Package類,它實際上與Gzipstream和DeflatStream相同,唯一不同的是你可以壓縮多個文件,然後可以用winzip/winrar打開7zip。這就是所有的.NET。但它甚至不是通用的.zip文件, 它是微軟用來壓縮其* x擴展office文件的東西。如果您使用包類解壓縮任何docx文件,則可以看到存儲在其中的所有內容。所以不要使用.NET庫進行壓縮甚至解壓縮,因爲您甚至無法制作通用壓縮文件,甚至無法解壓縮通用壓縮文件。你必須考慮第三方庫,如 http://www.icsharpcode.net/OpenSource/SharpZipLib/

或實施一切從底樓。

4

Tar-cs會完成這項工作,但速度很慢。我會建議使用SharpCompress這是顯着更快。它還支持其他壓縮類型,並且最近已更新。

using System; 
using System.IO; 
using SharpCompress.Common; 
using SharpCompress.Reader; 

private static String directoryPath = @"C:\Temp"; 

public static void unTAR(String tarFilePath) 
{ 
    using (Stream stream = File.OpenRead(tarFilePath)) 
    { 
     var reader = ReaderFactory.Open(stream); 
     while (reader.MoveToNextEntry()) 
     { 
      if (!reader.Entry.IsDirectory) 
      { 
       reader.WriteEntryToDirectory(directoryPath, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite); 
      } 
     } 
    } 
}