Guten Abend,
bin komplett ratlos, beim Exrahieren einer Datei kommt permanent diese Fehlermeldung:
Fehlermeldung:
Durch Extrahieren des Zip-Eintrags würde eine Datei außerhalb des angegebenen Zielverzeichnisses erstellt
in der Beschreibung:
Fehlermeldung:
IOException
Der Name eines Eintrags im Archiv ist Empty, enthält nur Leerraum oder enthält mindestens ein ungültiges Zeichen.
- oder - Extrahieren eines Eintrags aus dem Archiv würde Sie eine Datei erstellen, die sich außerhalb des Verzeichnisses befindet, das durch destinationDirectoryName angegeben ist. (Zum Beispiel geschähe dies möglicherweise, wenn der** Eintragsname Accessoren** des übergeordneten Verzeichnisses enthält.) - oder - Mehrere Einträge im Archiv haben denselben Namen.
Manuell kann ich das komischerweise im Explorer problemlos erledigen. Das Entpacken anderer Zipdateien ist im Programm ebenfalls problemlos möglich.
Hat irgendjemand eine Idee ? Genau auf diese Datei kommt es aber an ...
Bei Bedarf könnte ich die Zip- Datei zur Verfügung stellen, will sie aber hier nicht posten.
Andreas
noch ?????
Um die Fehlerquelle der ungültigen Zeichen auszuschließen, könntest du die ReadOnlyCollection<System.IO.Compression.ZipArchiveEntry> (Property System.IO.Compression.ZipArchive.Entries) mit System.IO.GetInvalidFileNameChars() abgleichen.
https://learn.microsoft.com/en-us/dotnet/api/system.io.path.getinvalidfilenamechars?view=net-6.0 (Docs)
Danke für Deine Antwort, habe das erst jetzt gesehen!!!!!!
Habe eine etwas andere Lösung gefunden, hole mir die Dateien einzeln aus dem ZIP :
(geht vor allen Dingen auch schneller 🙂)
public void GetFilesFromZip(string _myZip, string _pth)
{
using (ZipArchive ZIParchive = ZipFile.OpenRead(_myZip))
{
List<ZipArchiveEntry> _Za = new List<ZipArchiveEntry>();
foreach (ZipArchiveEntry entry in ZIParchive.Entries)
{
if (!string.IsNullOrEmpty(entry.Name)) _Za.Add(entry);
}
_Za = _Za.Where(p => Path.GetExtension(p.Name.ToLower()) == ".dat").ToList();
foreach (ZipArchiveEntry _Ztmp in _Za)
_Ztmp.ExtractToFile(Path.Combine(_pth,_Ztmp.Name), true);
}
}
noch ?????
In C# sind Unterstriche für Felder reserviert, nicht für Parameter oder Variablen.
C# Coding Conventions Wir sind hier auch nicht bei C oder C++, wo man Zeichen in Variablen spart.
Auch suggeriert ein GetXY, dass die Methode etwas zurück liefert.
Den ganzen Code kann man immens übersichtlicher und einfacher halten.
public void ExtractFilesFromZip(string zipFullname, string extractionPath)
{
using (ZipArchive archive = ZipFile.OpenRead(zipFullname))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
if (!string.IsNullOrEmpty(entry.Name) && Path.GetExtension(entry.Name).Equals(".dat", StringComparison.OrdinalIgnoreCase))
{
entry.ExtractToFile(Path.Combine(extractionPath, entry.Name), true);
}
}
}
}
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code