2016-11-20 56 views
0

如何知道我使用GzipStream的壓縮文件的大小?我知道它有一個標題和後綴。前10個字節 - 它是標題,第二個8字節 - 後綴。我如何知道後綴中的大小文件?Gzipstream頭文件和後綴

回答

-1

該文件的最後四個字節包含未壓縮的文件大小。

this post,下面的代碼會給你的文件的大小:

RandomAccessFile raf = new RandomAccessFile(yourGzipFile, "r"); 
raf.seek(raf.length() - 4); 
int b4 = raf.read(); 
int b3 = raf.read(); 
int b2 = raf.read(); 
int b1 = raf.read(); 
int filesize = (b1 << 24) | (b2 << 16) + (b3 << 8) + b4; 
raf.close(); 

filesize將包含文件大小。

編輯:Appologies,我注意到你已經用C#標記了你的帖子,但是上面的代碼是用於Java的,儘管上面的代碼肯定會把你放在正確的道路上。

祝你好運。

---- ----編輯

按照由@gusman作出評論,我在編輯這條評論,這樣的向下票可以被刪除。請參閱my other answer below瞭解我的替代代碼示例。

+0

請說明降級?謝謝 – WizzKidd

+0

這是Java,而不是C#。在某些情況下,C#和Java可以非常相似並且可以接受使用c#或c#與java一起回答java,但在這種情況下,代碼是完全不同的。 – Gusman

+1

如果你編輯你的答案,並將其他答案放在這裏,我將刪除否定的投票,我不能刪除,除非你修改答案,S.O.不允許。 – Gusman

0

我看到你投下了我以前的回答很可能是因爲它是一個使用Java的例子。原理仍然是一樣的,所以你的問題的答案是最後4個字節包含你需要的信息。希望這個答案更符合你的想法。

這裏是解壓gzip的包容性越來越被GZipStream使用的壓縮文件的大小的C#Decompress功能例如:

static public byte[] Decompress(byte[] b) 
{ 
    MemoryStream ms = new MemoryStream(b.length); 
    ms.Write(b, 0, b.Length); 
    //last 4 bytes of GZipStream = length of decompressed data 
    ms.Seek(-4, SeekOrigin.Current); 
    byte[] lb = new byte[4]; 
    ms.Read(lb, 0, 4); 
    int len = BitConverter.ToInt32(lb, 0); 
    ms.Seek(0, SeekOrigin.Begin); 
    byte[] ob = new byte[len]; 
    GZipStream zs = new GZipStream(ms, CompressionMode.Decompress); 
    zs.Read(ob, 0, len); 
    returen ob; 
} 
0

東西好一點寫:

public int GetUncompressedSize(string FileName) 
{ 
    using(BinaryReader br = new BinaryReader(File.OpenRead(pathToFile)) 
    { 
     br.BaseStream.Seek(SeekOrigin.End, -4); 
     return br.ReadInt32(); 
    } 
}