Ho un file zippato con dimensioni di diversi GB, voglio ottenere la dimensione del contenuto decompresso ma non voglio decomprimere il file in C#, quale potrebbe essere la libreria che posso usare ? Quando faccio clic con il pulsante destro del mouse sul file .gz e vai su Proprietà, sotto la scheda Archive
c'è un nome di proprietà TotalLength
che mostra questo valore. Ma voglio farlo programmaticamente usando C#. Qualche idea?File GZIP Lunghezza totale in C#
risposta
Gli ultimi 4 byte del file gz contiene la lunghezza.
Così 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);
}
ah, molto meglio; Non sono sicuro di come questo viene gestito quando> 4 GB anche se –
Grazie Leppie ... effettivamente nel mio caso il file sarà inferiore a 4 GB ... Grazie per il vostro aiuto ... –
@johnnyrose: Grazie per la correzione di errore: D – leppie
public static long mGetFileLength(string strFilePath)
{
if (!string.IsNullOrEmpty(strFilePath))
{
System.IO.FileInfo info = new System.IO.FileInfo(strFilePath);
return info.Length;
}
return 0;
}
MODIFICA: 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 - I Ho visto lo GZipStream
e l'equivalente SharpZipLib - non funziona. Il meglio che posso suggerire è quello di eseguire localmente:
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;
}
}
Grazie Marc, il primo metodo ha funzionato per me .. ma ci vuole troppo tempo per calcolare un file non compresso di 2 GB ... e dovrebbe essere come stiamo contando in loop ... Non c'è un modo rapido? –
@Ummar: sia io che Gabe abbiamo spiegato il modo "corretto" di farlo. Il metodo sopra funzionerà, ma immaginate di usarlo su migliaia di file da 2 GB, ci vorrà per sempre. – leppie
@Ummar - vedere la risposta di @ leppie –
l'ultimo per byte di un file .gz sono le dimensioni del modulo di ingresso non compresso 2^32. Se il file non compresso non è più grande di 4 GB, leggi solo gli ultimi 4 byte del file. Se hai un file più grande, non sono sicuro che sia possibile ottenere senza decomprimere il flusso.
Le informazioni potrebbero essere presenti nell'intestazione gzip. Ma non posso aiutare di più. – leppie