di file GZIP lunghezza totale in C #
Domanda
Ho un file compresso con dimensioni di diversi GB, voglio ottenere la dimensione dei contenuti Unzipped, ma non voglio in realtà decomprimere il file in C #, quale potrebbe essere la Biblioteca posso usare? Quando mi fate clic destro sul file .gz e vado a Proprietà poi sotto il Archive
Tab v'è un nome di proprietà TotalLength
che sta mostrando questo valore. Ma voglio farlo a livello di programmazione utilizzando C # .. Qualche idea?
Soluzione
Gli ultimi 4 byte del file gz contiene la lunghezza.
Quindi dovrebbe essere qualcosa di simile:
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);
}
Altri suggerimenti
L'ultima di byte di un file .gz sono le dimensioni di ingresso non compressa modulo 2 ^ 32. Se il file non compresso non è più grande di 4 GB, basta leggere gli ultimi 4 byte del file. Se si dispone di un file più grande, non sono sicuro che sia possibile ottenere senza decomprimere il flusso.
EDIT: vedere le risposte di leppie e Gabe; l'unica ragione per cui sto tenendo questo (anziché eliminarlo) è che può essere necessario se si sospetta che la lunghezza è> 4GB
Per gzip, che i dati non sembra essere direttamente disponibili - Ho guardato GZipStream
e la SharpZipLib equivalente - né opere. Il meglio che posso suggerire è quello di eseguire in locale:
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;
}
}
Se fosse un lampo, poi SharpZipLib:
long size = 0;
using(var zip = new ZipFile(path)) {
foreach (ZipEntry entry in zip) {
size += entry.Size;
}
}
public static long mGetFileLength(string strFilePath)
{
if (!string.IsNullOrEmpty(strFilePath))
{
System.IO.FileInfo info = new System.IO.FileInfo(strFilePath);
return info.Length;
}
return 0;
}