ZipFile.CreateFromDirectory - Problem mit Umlauten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von TRiViUM.

    ZipFile.CreateFromDirectory - Problem mit Umlauten

    Hallo Leute,

    ich verwende zum komprimieren (archivieren) eines kompletten Ordners die .NET Funktion ZipFile.CreateFromDirectory().

    Befinden sich in Dateien oder Ordnern umlaute, dann werden diese nicht korrekt gespeichert.
    Beispiel: aus "Handbücher" wird "Handb++cher".
    Gibt es eine Möglichkeit die Dateien mit original Codtabelle zu speichern?
    Ich habe im Netz schon etwas herumgesucht, aber immer nur Fragen zu diesem Thema gefunden, jedoch keine Antworten.

    Ein weiteres Phänomen habe ich bei diesen von mir erstellten ZIP-Dateien.
    Versuche ich z.B. eine Datei oder einen Ordner über den Windows-Dateiexplorer aus der Zipdatei zu löschen, dann sieht es auf den ersten Blick aus als wäre die Datei oder der Ordner gelöscht. Wartet man jedoch ein paar Sekunden oder öffnet die ZIP-Datei erneut, dann sind diese Daten wieder da.
    Woran könnte das liegen?

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Hallo EaranMaleasi,

    danke für den Tipp. Ich hab mal das versucht und das funktioniert nun auch (was die Sonderzeichen betrifft):

    VB.NET-Quellcode

    1. ZipFile.CreateFromDirectory(My.Settings.FlexX_Datenverzeichnis, Path.Combine(FolderBrowserDialog1.SelectedPath, ZipDatei), System.IO.Compression.CompressionLevel.Optimal, False, System.Text.Encoding.GetEncoding(850))


    Jedoch kann ich immer noch keine Dateien oder Ordner manuell aus dem ZIP-Archiv löschen (über den Windows-Explorer).

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dive26“ ()

    dive26 schrieb:

    manuell aus dem ZIP-Archiv löschen
    Geht bei mir problemlos.
    Womit ist die Extension "Zip" bei Dir verknüpft?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mit dem ganz normalen Windows Explorer.
    Habe gerade versucht das Zipfile mi 7-Zip zu öffnen. Damit lassen sich einzelne Dateien und Ordner rauslöschen.

    @Eierlein
    Das € Zeichen muss gar nicht funktionieren. Wichtig sind die deutschen Umlaute und das scharfe ß.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Ich weiß, der Beitrag ist schon etwas älter.
    Ich bin auf das gleiche Problem gestoßen und hab mich mit der Thematik solange befasst, bis ich eine Lösung gefunden hatte.
    Da hier noch keine Lösung bzw. Erklärung bereitgestellt wurde, dachte ich, ich teile diese mit euch :rolleyes:

    Kurz und Knapp:
    Beim Entpacken muss die CodePage 437/850 ausgewählt werden:

    C#-Quellcode

    1. ZipFile.ExtractToDirectory( "zipFilePath", "targetDirectory", System.Text.Encoding.GetEncoding( 437 ) );//optional 850


    Hintergrund:
    Normalerweise ist die Standard-Codepage von Windows 1252.
    Die Codepage 437/850 stammt noch aus DOS-Zeiten und wird scheinbar auch noch in Windows neben der 1252 genutzt.
    Scheinbar werden die Zip-Dateien mit der Codepage 437 gepackt und wenn man sie mit einer anderen Codepage entpackt, werden manche Buchstaben anders umgeschlüsselt, da die Codepages unterschiedlich sind.

    Hab es selber mit einer Textdatei namens "äÄüÜöÖß.txt" getestet.
    Das Euro-Zeichen lässt Windows gar nicht erst als Dateinamen in einem Zip-Archiv zu...

    Kurzer Nachtrag:
    Wenn man die Funktion ZipFile.ExtractToDirectory nutzt, hat man keinen Einfluss mehr darauf, was entpackt werden soll.
    Hier eine Funktion, welche alle Dateien im Archiv separat inkl. korrektem Datei/Ordnernamen behandelt:

    C#-Quellcode

    1. using (ZipArchive archive = ZipFile.OpenRead( zipArchive ))
    2. {
    3. foreach (ZipArchiveEntry entry in archive.Entries)
    4. {
    5. // Gets the full path to ensure that relative segments are removed.
    6. string destinationPath = Path.GetFullPath( Path.Combine( extractPath, entry.FullName ) );
    7. //restore original file and directory names
    8. byte[] raw = Encoding.Default.GetBytes( destinationPath );
    9. destinationPath = Encoding.GetEncoding( 437 ).GetString( raw );
    10. if (entry.Name.Length == 0)//is directory
    11. { if (!Directory.Exists( destinationPath )) Directory.CreateDirectory( destinationPath ); }
    12. else//is file
    13. { if (destinationPath.StartsWith( extractPath, StringComparison.Ordinal )) entry.ExtractToFile( destinationPath, true ); }
    14. }
    15. }

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „TRiViUM“ ()