Quando decomprimere i file in Windows, io a volte problemi con i percorsiCome gestire decomprimere ZipFile con percorsi che sono troppo lunghi/duplicare
- che sono troppo lunghi per Windows (ma va bene nel sistema operativo originale che creato il file).
- che sono "duplicato" a causa di caso-insensibilità
Utilizzando DotNetZip, la chiamata sarà ZipFile.Read(path)
merda ogni volta che la lettura di file zip con uno di questi problemi. Il che significa che non posso nemmeno provare a filtrarlo.
using (ZipFile zip = ZipFile.Read(path))
{
...
}
Qual è il modo migliore per gestire la lettura di questi tipi di file?
Aggiornato:
Esempio zip da qui: https://github.com/MonoReports/MonoReports/zipball/master
Duplicati: https://github.com/MonoReports/MonoReports/tree/master/src/MonoReports.Model/DataSourceType.cs https://github.com/MonoReports/MonoReports/tree/master/src/MonoReports.Model/ DatasourceType.cs
Ecco più in dettaglio sulla eccezione:
Ionic.Zip.ZipException: impossibile leggere come file zip
---> System.ArgumentException: un elemento> con la stessa chiave è già stato aggiunto.
a System.ThrowHelper.ThrowArgumentException (risorsa ExceptionResource)
a System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add)
2.Add (chiave TKey, TValue valore)
at System.Collections.Generic.Dictionary
a Ionic.Zip.ZipFile.ReadCentralDirectory (ZipFile ZF)
a Ionic.Zip.ZipFile.ReadIntoInstance (ZipFile ZF)
Risoluzione:
sulla base @ suggerimento di Cheeso, posso leggere tutto dal flusso, quelle duplicati evitando, e problemi di percorso:
//using (ZipFile zip = ZipFile.Read(path))
using (ZipInputStream stream = new ZipInputStream(path))
{
ZipEntry e;
while((e = stream.GetNextEntry()) != null)
//foreach(ZipEntry e in zip)
{
if (e.FileName.ToLower().EndsWith(".cs") ||
e.FileName.ToLower().EndsWith(".xaml"))
{
//var ms = new MemoryStream();
//e.Extract(ms);
var sr = new StreamReader(stream);
{
//ms.Position = 0;
CodeFiles.Add(new CodeFile() { Content = sr.ReadToEnd(), FileName = e.FileName });
}
}
}
}
Il file .zip o .gz? – SimpleVar
.zip (in particolare dai download di github zipfile) – gameweld
Puoi mostrare l'errore? È il percorso all'interno del file? La posizione del file di destinazione è troppo lunga? – yamen