2011-01-12 42 views
8

Tôi có tệp nén có kích thước vài GB, tôi muốn lấy kích thước của Nội dung chưa giải nén nhưng không muốn giải nén tệp trong C#, Thư viện nào tôi có thể sử dụng ? Khi tôi nhấp chuột phải vào tập tin .gz và vào Properties sau đó dưới Archive Tab có một tên bất động sản TotalLength đang hiển thị giá trị này. Nhưng tôi muốn làm cho nó lập trình bằng cách sử dụng C# .. Bất kỳ ý tưởng?Tệp GZIP Tổng chiều dài trong C#

+0

Thông tin có thể có trong tiêu đề gzip. Nhưng tôi không thể giúp nhiều hơn thế. – leppie

Trả lời

8

4 byte cuối cùng của tập tin gz chứa chiều dài.

Vì vậy, nó phải được cái gì đó như:

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

ah, tốt hơn nhiều; Tôi không chắc làm thế nào điều này được xử lý khi> 4GB mặc dù –

+0

Cảm ơn Leppie ... thực sự trong trường hợp của tôi tập tin sẽ ít hơn 4GB ... Cảm ơn sự giúp đỡ của bạn ... –

+0

@ johnnyrose: Cảm ơn bạn đã sửa lỗi chính tả: D – leppie

-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

EDIT: Xem câu trả lời của Leppie và Gabe; lý do duy nhất tôi giữ điều này (thay vì xóa nó) là có thể cần thiết nếu bạn nghi ngờ độ dài> 4GB


Đối với gzip, dữ liệu đó dường như không có sẵn trực tiếp - I đã xem xét GZipStream và tương đương SharpZipLib - không hoạt động. Điều tốt nhất tôi có thể đề nghị là để chạy nó tại địa phương:

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; 
     } 
    } 

Nếu đó là một zip, sau đó SharpZipLib:

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

Cảm ơn Marc, phương pháp đầu tiên đã làm việc cho tôi .. nhưng mất quá nhiều thời gian để tính toán một tệp không nén 2 GB ... và nó phải như chúng ta đếm trong vòng lặp ... Không có cách nào nhanh chóng? –

+0

@Ummar: Cả Gabe và bản thân tôi đều giải thích cách làm đúng đắn. Cách trên sẽ làm việc, nhưng hãy tưởng tượng sử dụng nó trên 1000 của các tập tin 2GB, nó sẽ mất mãi mãi. – leppie

+0

@Ummar - xem câu trả lời của @ leppie –

4

cuối cùng cho byte của một tập tin gz là đầu vào không nén kích thước modulo 2^32. Nếu tệp không nén của bạn không lớn hơn 4GB, chỉ cần đọc 4 byte cuối cùng của tệp. Nếu bạn có tệp lớn hơn, tôi không chắc chắn rằng nó có thể nhận được mà không giải nén luồng.

Các vấn đề liên quan