Kompletes Verzeichniss zippen und entzippen

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

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von MemoAnMichSelbst.

    Kompletes Verzeichniss zippen und entzippen

    Hi
    Ich habe mich jetzt schon längere Zeit durch Google gekämpft um herauszufinden wie ich ein einfaches Verzeichnis zippen und wieder entzippen kann.
    Ich habe dabei auch schon eine Möglichkeit gefunden. Sobald das Verzeichnis aber ein bisschen größer ist passiert nichts mehr (Ionic.Zip.dll)
    Vielleicht hat ja irgendjemand ne Idee wie das gehen würde.

    Danke schon mal :)
    LG Wolf
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Moin,

    jo, wenn Du .NET 4.5 da hast, kannste das ja ohne weitere Abhängigkeiten machen. Ionic.Zip ist ansonsten eine gute Lösung.
    Wie auch immer, was meinst Du mit "passiert nichts mehr"?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Wie groß ist denn das Paket? Ist das UI eingefroren? Dann fehlt Dir halt Multithreading. ;)

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Kommt halt drauf an, wie Du das machen willst. Bei .NET 4.5 bietet sich TAP an, also async und await mit Tasks.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ist auf jeden Fall geraten, es zunächst mal ohne MultiThreading zu machen.
    Also die Zipperei erstmal auf einen Entwicklungsstand bringen, der überhaupt funktioniert.

    In einem 2. Schritt dann auf Threading umstellen.

    Schrittweise entwickeln halt, nicht versuchen, alles auf einmal zu lösen.

    Das Umstellen auf Threading ist sehr einfach, wenn man winz-bischen was von Programmieren versteht, etwa Code in eigene Methoden verlagern kann, die geeignete Parameter entgegenehmen, und sowas.
    Aber selbst wenn das auch nicht gegeben ist, ists kein Beinbruch - dann lernt man das halt gleich mit. :D

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich habs jetzt so, aber genau hier steht die UI dann

    VB.NET-Quellcode

    1. SFDExportieren.FileName = lbMain.SelectedItem
    2. If SFDExportieren.ShowDialog = Windows.Forms.DialogResult.OK Then
    3. Using zip As New ZipFile
    4. zip.AddDirectory("C:\Users\" + pcname + "\AppData\Roaming\.minecraft\MM\" + lbMain.SelectedItem)
    5. zip.Save(SFDExportieren.FileName)
    6. End Using
    7. MsgBox(lbMain.SelectedItem + " wurde erfolgreich exportiert!", MsgBoxStyle.Information, "!")
    8. End If


    Dann wirst du wohl um einen seperaten Thread nicht herum kommen. Wie schon erwähnt wurde, erstell dir für das entpacken eine eigene Methode und rufe diese dann in einem eigenen Thread auf.

    Multithreaded Programming with Visual Basic .NET

    *Edit*

    PS: für deine Pfad angabe kannst du Umgebungs -Variablen nutzen

    VB.NET-Quellcode

    1. System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), ".mincraft", "MM")


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Fakiz“ ()

    Wolf066 schrieb:

    Ich habs jetzt so, aber genau hier steht die UI dann
    Ja, und jetzt kommts, was ich in post#12 bereits andeutet:
    Dein Code zeigt keine Methode, sondern nur ein paar lose Zeilen.
    Man kann aber nur ganze Methoden in NebenThreads verfrachten, also kannst du vlt. die ganze Methode posten, die das Zippen übernimmt?

    Und wenn die Zeilen in einer Button_Click-Methode stehen, dann bitte auslagern in eine richtige Methode, die sich ganz auf ihren Job konzentriert. Also keine Handles-Klausel, kein sender-Parameter, keine Eventargs, sondern die Methode soll den Pfad des Verzeichnisses und den AusgabePfad entgegennehmen, und mit diesen Argumenten dann ihren Zip-Job machen.
    Sie darf auch nicht lbMain.SelectedItem abrufen, sondern - wie gesagt - diese Information ist ihr als Argument zu übergeben. Es muss eine autarke Methode sein, ohne weitere Abhängigkeiten.
    So eine Methode kann man dann mit Leichtigkeit "threaden".
    Wenn ich es mit System.IO.Compression mache dann kommt der Fehler, dass ZipFile nicht deklariert wurde(Obwohl es so auf der Microsoft seite zu diesem Thema steht) von System.IO.Compression ist und wenn ich es mit Ionic mache dann hängt es sich wieder auf
    Ionic Code:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.IO.Compression
    3. Imports Ionic.Zip
    4. Module Module1
    5. Sub Main(dire As String, ziel As String)
    6. Using Zip As New ZipFile()
    7. Zip.AddDirectory(dire)
    8. Zip.Save(ziel)
    9. End Using
    10. End Sub
    11. End Module
    Das ist vonne Struktur her schonmal eine gut geeignete Methode. Nur Main sollte sie nicht heissen - wie würdest du etwa eine Methode benennen, die ein Verzeichnis zippen soll?
    Naja - weil meist die Leuts von meine einfachen Fragen so verdattert sind, mache ich mal selbst einen Vorschlag - da wird vlt auch was an Benamungsprinzipien deutlich:
    Also eine Methode, die ein Verzeichnis zippen soll, die könnte man doch gut ZippeVerzeichnis() nennen, oder? ;) (Nomen est Omen!)

    Und jetzt brauchen wir noch das Stückerl Code, wo diese Methode aufgerufen wird. Weil da kann man dann Nebenläufigkeit einbauen, und dann hängt sich keiner mehr auf.