2011-01-12 92 views
8

我有幾個GB的大小壓縮文件,我想要得到的解壓縮的內容的大小,但不希望實際解壓文件在C#中,什麼可能是圖書館,我可以使用?當我的。廣州文件點擊右鍵,選擇屬性,然後在Archive選項卡下有一個屬性名稱TotalLength這顯示該值。但我想以編程方式使用C#獲得它..任何想法?GZIP文件總長

+0

的信息可能會出現在gzip頭。但我無法幫助更多。 – leppie 2011-01-12 07:01:01

回答

8

最後4個字節GZ文件包含的長度。

因此,它應該是這樣的:

using(var fs = File.OpenRead(path)) 
{ 
    fs.Position = fs.Length - 4; 
    var b = new byte[4]; 
    fs.Read(b, 0, 4); 
    uint length = BitConverter.ToUInt32(b, 0); 
    Console.WriteLine(length); 
} 
-1
public static long mGetFileLength(string strFilePath) 
{ 
    if (!string.IsNullOrEmpty(strFilePath)) 
    { 
     System.IO.FileInfo info = new System.IO.FileInfo(strFilePath); 
     return info.Length; 
    } 

    return 0; 
} 
2

編輯:請參閱由Leppie和Gabe的答案;我保持這個(而不是刪除)的唯一原因是,如果你懷疑的長度可能有必要> 4GB


gzip的,這些數據似乎並沒有直接可用 - 我「VE看着GZipStreamSharpZipLib相當於 - 既不工作。我建議最好是在本地運行它:

long length = 0; 
    using(var fs = File.OpenRead(path)) 
    using (var gzip = new GZipStream(fs, CompressionMode.Decompress)) { 
     var buffer = new byte[10240]; 
     int count; 
     while ((count = gzip.Read(buffer, 0, buffer.Length)) > 0) { 
      length += count; 
     } 
    } 

如果它是一個zip,然後SharpZipLib:

long size = 0; 
    using(var zip = new ZipFile(path)) { 
     foreach (ZipEntry entry in zip) { 
      size += entry.Size; 
     } 
    } 
+0

感謝馬克,第一種方法爲我工作..但它的時間太長計算2 GB未壓縮的文件......這應該是我們在循環指望...是不是有什麼快捷方式? – 2011-01-12 07:40:23

+0

@Ummar:Gabe和我都解釋了這樣做的「正確」方式。上面的方式可以工作,但想象一下在1000GB的2GB文件上使用它,這將會持續下去。 – leppie 2011-01-12 07:46:46

4

最後一個。廣州文件的字節是未壓縮輸入尺寸模數2^32。如果您的未壓縮文件不大於4GB,只需讀取文件的最後4個字節即可。如果你有一個更大的文件,我不確定沒有解壓縮流是可能的。