ZIP-File richtig entpacken und den alten Ordner umbenennen!

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

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

    ZIP-File richtig entpacken und den alten Ordner umbenennen!

    Moin! :)
    Ich möchte gerne eine ZIP-File entpacken.
    Zuerst entpacke ich diese mit der Endung #.
    Dann wird der alte Ordner gelöscht.
    Und danach der neue Ordner mit der Endung #, wird unbenannt,
    in den ersten Name. Also ohne die Endung #.
    Mein Code funktioniert nur solange ich mit dem Sleep arbeite!

    Sobald ich diese Sleep Zeile entfernt habe, erscheint eine Fehlermeldung!
    Deshalb möchte ich euch fragen, wie ich den Code verbessern kann.
    Da ich glaube das es bestimmt eine bessere Lösung als das Sleep gibt.
    Freue mich auf eure hilfreichen Antworten.
    BIG THX

    Inhalt der Variablen:
    neuerPfad = "D:\Temp\code\DingsDa#"
    alterPfad = "D:\Temp\code\DingsDa"
    Me.lbEntpackenProjekte = {SelectedItem = "H:\DingsDa.zip"}


    Sleep:

    VB.NET-Quellcode

    1. System.Threading.Thread.Sleep(1000) '<---


    Die Fehlermeldung:
    System.IO.IOException: "Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist.

    Im Anhang ein Bild:

    ?(
    Visual Basic.NET 8o
    MS-SQL
    8o
    Ein einziges pauschales Sleep ist möglich, aber auch unsicher. Das Problem: Das Löschen geht nicht von jetzt auf geradeeben, sondern braucht etwas Zeit. Klar, ne Sekunde Wartezeit dürfte reichen, bis das Ganze gelöscht ist. Aber wenn die Datei groß ist, kann es auch mit dem einen Pauschal-Sleep daneben gehen.
    Verbesserungs-Spekulatius:

    VB.NET-Quellcode

    1. Dim Counter = 0
    2. Do While IO.File.Exists(alterPfad) AndAlso Counter < 10
    3. Threading.Thread.Sleep(100)
    4. Counter += 1
    5. Loop
    6. If IO.File.Exists(alterPfad) Then Throw New Exception("Das Löschen der Datei dauert zu lange oder ist anderweitig nicht möglich.")
    7. IO.Directory.Move(neuerPfad, alterPfad)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Das Löschen geht nicht von jetzt auf geradeeben

    Ich würde tatsächlich erstmal behaupten, dass der Delete-Befehl so lange wartet, bis das Verzeichnis gelöscht ist. Ich schätze gerade eher in der ​EntpackFolder-Methode ist etwas falsch und das Sleep(1000) wartet jetzt bis der GC das Handle auf den Ordner endlich geschlossen hat.
    Kannst du mal die ​EntpackFolder-Methode posten?
    Imports System.IO.Compression

    VB.NET-Quellcode

    1. Private Sub KomprimiereFolder(startPath As String, zipPath As String)
    2. ZipFile.CreateFromDirectory(startPath, zipPath) ' ohne Try Catch!
    3. End Sub
    4. Private Sub EntpackFolder(startPath As String, zipPath As String)
    5. ZipFile.ExtractToDirectory(zipPath, startPath) ' ohne Try Catch!
    6. End Sub


    Das ist der Code.
    Visual Basic.NET 8o
    MS-SQL
    8o
    Mhh und greifst du an einer anderen Stelle auf den Ordner zu? Ich habe das mal versucht als simplen C# Test abzubilden. Wie du siehst, ohne Sleep() direkt in einer Schleife und ich bekomme keinen Fehler. Er mach das alles korrekt und hintereinander. VB wird davon nicht abweichen. Ich glaube immer noch, dass du an einer anderen Stelle im Code den Ordner irgendwie noch blockierst. Wenn du das sauber lösen möchtest, dann würde ich da nochmal drüber gehen.

    C#-Quellcode

    1. static void Main(string[] args) {
    2. string neuerPfad = @"C:\Users\x\Desktop\X\Entpackt#";
    3. string alterPfad = @"C:\Users\x\Desktop\X\Entpackt";
    4. string zipFile = @"C:\Users\x\Desktop\X\GZip.zip";
    5. for (int i = 0; i < 200; i++) {
    6. EntpackFolder(neuerPfad, zipFile);
    7. System.IO.Directory.Delete(alterPfad, true);
    8. System.IO.Directory.Move(neuerPfad, alterPfad);
    9. }
    10. }
    11. private static void EntpackFolder(string startPath, string zipPath) {
    12. ZipFile.ExtractToDirectory(zipPath, startPath);
    13. }