Zu den Aufzeichnungen der tutorials.de-Live-Workshops
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
15
ZUGRIFFE
8049
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    chrisdu chrisdu ist offline Grünschnabel
    Registriert seit
    Mar 2004
    Beiträge
    1
    hallo zusammen,

    habe bereits über

    using ICSharpCode.SharpZipLib.Checksums;
    using ICSharpCode.SharpZipLib.Zip;
    using ICSharpCode.SharpZipLib.GZip;

    in c# gezipped...

    nun möchte ich allerdings einen kompletten ordner incl. dessen unterordner und dateien zippen und diese struktur auch später wieder in meinem zip file wiederfinden, jemand ne ahnung wie das geht...?

    danke im voraus

    chris
     

  2. #2
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Hallo.

    Ich löse das wie folgt:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
     
    private void btnZip_Click(object sender, System.EventArgs e)
    {
        ZipOutputStream s = new ZipOutputStream(File.Create(@"C:\testzip.zip"));
        s.SetLevel(1);
        DirectoryInfo maindir = new DirectoryInfo(txtPath.Text);
        parentPath = maindir.Parent.FullName + @"\";
        MessageBox.Show(parentPath);
     
        GoSubdirs(ref s,this.txtPath.Text);
     
        s.Close();
        lblMessage.Text = "done";
    }
     
    private void GoSubdirs(ref ZipOutputStream s, string path)
    {
        DirectoryInfo dir = new DirectoryInfo(path);
        foreach (DirectoryInfo subdir in dir.GetDirectories())
        {
            GoSubdirs(ref s, subdir.FullName);
        }
        foreach (FileInfo fi in dir.GetFiles())
        {
            FileStream fs = File.OpenRead(fi.FullName);
                
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            ZipEntry entry = new ZipEntry(dir.FullName.Replace(parentPath,"") + "/" + fi.Name);
            entry.Size = fs.Length;
            fs.Close();
            s.PutNextEntry(entry);
            s.Write(buffer, 0, buffer.Length);
        }
    }

    Im Textfeld txtPath steht der Pfad zum Verzeichniss das gepackt werden soll, in der Variable parentPath steht der Pfad in dem sich das zu packende Verzeichniss befindet.
    Das benutze ich dann beim Erstellen des ZipEntries um vom vollen Namen mit dem ganzen Pfad nur den relativen Pfad zu erhalten.
    Beim relativen Pfad erkennt er dann automatisch die Verzichnisse.

    Mfg,
    Alex
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  3. #3
    vbler22 vbler22 ist offline Grünschnabel
    Registriert seit
    Jul 2005
    Beiträge
    4
    Hallo,

    nach einigen Anpassungen habe ich das Programm zum laufen bekommen. Kannst du mir noch ein Beispiel geben, mit dem ich die Dateien wieder entpacke ? Die beigelegten Beispiele können keine ZIP Dateien entpacken, wenn sie Unterordner enthalten.
     

  4. #4
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Hi.

    Hier ein Snippet wie ich entpacke. Habs gleich aus einem meiner Programme kopiert.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    using IO = System.IO;
    ...
    string output_dir = IO.Path.GetDirectoryName(file);
     
    using (ZipInputStream z_input = new ZipInputStream(new IO.FileStream(file,IO.FileMode.Open)))
    {
     
        ZipEntry zipee;
        while ((zipee = z_input.GetNextEntry())!= null)
        {
            string dir_name     = IO.Path.GetDirectoryName(zipee.Name);
            string file_name    = IO.Path.GetFileName(zipee.Name);
            dir_name = System.IO.Path.Combine(output_dir, dir_name);
     
            IO.Directory.CreateDirectory(dir_name);
     
            if (!file_name.Equals(string.Empty))
            {
                using (IO.FileStream writer = IO.File.Create(IO.Path.Combine(dir_name, file_name)))
                {
                    int size = 2048;
                    byte[] data = new byte[2048];
                    while (true) 
                    {
                        size = z_input.Read(data, 0, data.Length);
                        if (size > 0) 
                            writer.Write(data, 0, size);
                        else 
                            break;
                    }
                }
            }   
        }
     
        z_input.Close();
    }

    Ich hoff der Code ist dir verständlich.

    Lg,
    Alex
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  5. #5
    vbler22 vbler22 ist offline Grünschnabel
    Registriert seit
    Jul 2005
    Beiträge
    4
    Hallo,

    ich habe den Code jetzt so geändert, damit er in VB läuft.
    Das entpacken der Unterordnerfunktioniert jetzt. Die Dateien haben aber nach dem entpacken alle eine Größe von 0 Byte.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
        Public Sub ZipEntpacken(ByVal strQuellzip, ByVal strZiel)
     
            Dim z_input As ZipInputStream = New ZipInputStream(New IO.FileStream(strQuellzip, IO.FileMode.Open))
            Try
                Dim zipee As ZipEntry
                Do While 1
                    zipee = z_input.GetNextEntry
     
                    If zipee Is Nothing Then Exit Do
     
                    Dim dir_name As String = IO.Path.GetDirectoryName(zipee.Name)
                    Dim file_name As String = IO.Path.GetFileName(zipee.Name)
                    dir_name = System.IO.Path.Combine(strZiel, dir_name)
                    IO.Directory.CreateDirectory(dir_name)
                    If Not file_name.Equals(String.Empty) Then
     
                        Dim writer As IO.FileStream = IO.File.Create(IO.Path.Combine(dir_name, file_name))
                        Try
                            Dim size As Integer = 2048
                            Dim data(2048) As Byte
                            While file_name.Equals(String.Empty) 'True
                                size = z_input.Read(data, 0, data.Length)
                                If size > 0 Then
                                    writer.Write(data, 0, size)
                                Else
                                    ' break
                                End If
                            End While
                        Finally
                            CType(writer, IDisposable).Dispose()
                        End Try
                    End If
                Loop
                z_input.Close()
     
            Finally
                CType(z_input, IDisposable).Dispose()
            End Try

    Edit von Alex S.: Bitte Code-Tags verwenden
     

  6. #6
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Hi.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    While file_name.Equals(String.Empty) 'True
      size = z_input.Read(data, 0, data.Length)
      If size > 0 Then
        writer.Write(data, 0, size)
      Else
         ' break
      End If
    End While

    Hier wird der Fehler liegen.
    file_name.Equals(String.Empty) liefert in dem Fall ja false

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    Do While True
      size = z_input.Read(data, 0, data.Length)
      If size > 0 Then
        writer.Write(data, 0, size)
      Else
         Exit Do' break
      End If
    Loop

    Das sollte klappen, wenn der VB.net Code lauffähig ist. Bin die Syntax nicht wirklich gewöhnt.
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  7. #7
    vbler22 vbler22 ist offline Grünschnabel
    Registriert seit
    Jul 2005
    Beiträge
    4
    Der Code funktioniert jetzt. In der Schleife fehlte ein Exit Do. Der Übersetzer konnte das break; wohl nicht umwandeln und hat es auskeklammert.

    Soweit läuft das Programm jetzt. Die exe Dateien laufen nach dem entpacken wieder. Probleme habe ich aber bei Textdateien die z.B. folgenden Text enthält:

    nvWHBxBUM7SBWTwYiN9TOkPL1Jj+a6KoEqBN2RrvOEouf2lBa28z1Y7X/GGBpVXhGoUHKH13ignRC+psVJsCi3m4LptP35oBinCFHuFSNafxf4TgfwnzQTM4Z3JrKDzz3uISHYgECv5kAa76ttglsCHedZNnT BC6zosEuy6K6l8Xp4FTctWlA9Hlet+5ymhehCAJiIY+VJ5BtnxVWSg2xKAv+hZCukuHPUGINw5diRo=

    236 Byte.

    Nach dem Entpacken hat sie am Ende ein Leerzeichen, ist 237 Byte groß. Dadurch ist sie nicht mehr brauchbar. Ist das jetzt ein Fehler in der Ziplib, oder mache ich etwas falsch ?

    Den Originalcode habe ich nicht hinbekommen, ich habe den Packer so verändert:
    Ich möchte nicht den Hauptordner mitpacken, sondern nur die Unterordner und die enthaltenen Dateien.



    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    Dim strHauptpfad As String = Application.StartupPath + strTZ + "Programmdateien\"
     
            Dim s As ZipOutputStream = New ZipOutputStream(File.Create("monoinstaller.zip"))
            s.SetLevel(9)
     
            Dim maindir As DirectoryInfo = New DirectoryInfo(strHauptpfad)
            Dim parentPath As String = maindir.ToString
     
            GoSubdirs(s, parentPath, strHauptpfad)
     
            s.Close()
            MessageBox.Show("Fertig")

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    Private Sub GoSubdirs(ByRef s As ZipOutputStream, ByVal path As String, ByVal strHauptpfad As String)
            Dim dir As DirectoryInfo = New DirectoryInfo(path)
            Dim subdir As DirectoryInfo
            For Each subdir In dir.GetDirectories()
                GoSubdirs(s, subdir.FullName, strHauptpfad)
            Next
            Dim fi As FileInfo
            For Each fi In dir.GetFiles()
                Dim fs As FileStream = File.OpenRead(fi.FullName)
     
                ' im Normalfall allokiert man die Buffer im voraus
                ' hier aus Klarheitsgründen pro Datei einmal
                Dim buffer() As Byte = New Byte(fs.Length) {}
                fs.Read(buffer, 0, buffer.Length)
     
                ' und jetzt schreiben wir einen ZipEntry & die Daten      
     
                Dim a As String = dir.FullName.Replace(strHauptpfad, "")
                If a <> "" Then
                    a = a + "\"     'Wenn Datei in einem Ordner ist
                Else
                    'Normale Datei im Hauptverzeichnis
                End If
     
                Dim enTry As ZipEntry = New ZipEntry(a + fi.Name)
                s.PutNextEntry(enTry)
                s.Write(buffer, 0, buffer.Length)
            Next fi
     
        End Sub
     

  8. #8
    vbler22 vbler22 ist offline Grünschnabel
    Registriert seit
    Jul 2005
    Beiträge
    4
    Habs rausgefunden.

    Danke
     

  9. #9
    Avatar von Asterix-Ac
    Asterix-Ac Asterix-Ac ist offline Mitglied Gold
    Registriert seit
    Jul 2003
    Ort
    Aachen (NRW)
    Beiträge
    215
    Hallo Leute,

    nun habe ich es geschafft, komplette Ordnerstrukturen zu zippen - Dank des Beitrages von Alex. Doch den Einpack-Vorgang möchte ich doch noch etwas korrigieren :
    Alex wandelt die absoluten Pfade in relative um. Das geht so lange gut, bis man auf die Root-Ebene stösst und dort einen Ordner komprimieren möchte. Beispiel : C:\Ordner
    Dieser wird nicht relativiert.
    Die Relativierung erfolgt in der Methode 'GoSubdirs' direkt im Argument vom neuen ZipEntry:
    Code :
    1
    
    ZipEntry entry = new ZipEntry(dir.FullName.Replace(parentPath,"") + "/" + fi.Name);
    Ersetzt diese Zeile mit den folgenden:
    Code :
    1
    2
    
    string relativPath = ZipEntry.CleanName(dir.FullName.Replace(parentPath,"") + "/" + fi.Name);
    ZipEntry entry = new ZipEntry(relativPath);
    Nun werden auch die Odner in den Rootverzeichnissen relativiert.

    Gruß,
    Asterix
     

  10. #10
    ecp ecp ist offline Grünschnabel
    Registriert seit
    Mar 2007
    Beiträge
    3
    Hey Leute!

    Bin halbwegs neu in C# und hab davor schon Ewigkeiten nicht mehr programmiert!
    Hier meine Frage: Habe den Code von Alex jetzt auch in mein Programm implementiert, jedoch bekomme ich immer den Fehler "Der Name "GoSubdirs" ist im aktuellen Kontext nicht vorhanden!".

    Was könnte ich vergessen oder Falsch gemacht haben

    Mfg ECP
     

  11. #11
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Hi.

    Mit einem kleinen Snippet würden wir uns leichter tun beim Beantworten der Frage.
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  12. #12
    ecp ecp ist offline Grünschnabel
    Registriert seit
    Mar 2007
    Beiträge
    3
    So hab es schon gefunden! Trotzdem Danke!
    Hatte ein kleines Deklarierungsproblem!

    Mfg ECP
     

  13. #13
    ecp ecp ist offline Grünschnabel
    Registriert seit
    Mar 2007
    Beiträge
    3
    Hey!

    Wie müsste ich den code abändern, um nur eine Datei ohne Ordner zu Zippen?

    Mfg ECP
     

  14. #14
    ForceDragonX ForceDragonX ist offline Mitglied
    Registriert seit
    Jul 2007
    Beiträge
    9
    @Alexander Schuc: Deine Snippets sind wirklich genial.
    Ich verwende bisher nur das erste Snippet (ich mache gerne alles nacheinander, das zweite Snippet kommt erst, wenn das folgende Problem gelöst ist).
    Nun kann ich allerdings keinen Fortschritt mithilfe eines Backgroundworkers aus dem DoWork()-Event holen, da die eigentliche Arbeit in GoSubDirs erfolgt.
    Wie mache ich denn, dass ich den Fortschritt dieses Events anzeigen lassen kann, oder den Gesamtfortschritt beider Events?
     

  15. #15
    Avatar von …•xXCecilXx•…
    …•xXCecilXx•… …•xXCecilXx•… ist offline Grünschnabel
    Registriert seit
    Sep 2007
    Ort
    Buchholz-Oberscheid
    Beiträge
    4
    Hallo Tutorials Team,
    Ich möchte den Thread hier gerne fortsetzen und zwar deshalb weil ich hier zwar C# beim Lösen des Zippens und entzippens finde aber das von mir benötigte VB leider nur im entzippen.
    Deshalb bitte ich euch mir evtl. das was Alex in C# gepostet hat mir irgentwie in VB.NET zuzeigen ich habe es mal versucht(werde es auch weiter versuchen) den Code umzuschreiben aber die fehlermeldungen werden irgentwie nicht kleiner (ks nur die ausgabe der Fehler nicht sofortige Rote meldungen das es garnicht erst anläuft ;P)
    wäre wirklcih sehr dankbar

    hier mal mein ehm Brei den ich aus dem C# von Alex geschaffen habe
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    Imports ICSharpCode.SharpZipLib.Zip
    Imports ICSharpCode.SharpZipLib.Core
    Imports System.IO
     
    Dim parentPath As String
     
    Private Sub btnZip_Click() 'object sender, System.EventArgs e)
            Dim s As New ZipOutputStream(File.Create(TextBox2.Text))
            s.SetLevel(1)
            Dim maindir As New DirectoryInfo(TextBox1.Text)
            parentPath = maindir.Parent.FullName + "\"
            MessageBox.Show(parentPath)
            GoSubdirs(s, TextBox1.Text)
            s.Close()
        End Sub
     
        Private Sub GoSubdirs(ByVal s As ZipOutputStream, ByVal path As String)
            Dim Dir As New DirectoryInfo(path)
            For Each subdir In Dir.GetDirectories()
                GoSubdirs(s, subdir.FullName)
            Next
            Dim fi As FileInfo
            For Each fi In Dir.GetFiles()
                Dim fs As FileStream = File.OpenRead(fi.FullName)
                Dim buffer(fs.Length) As Byte
                fs.Read(Buffer, 0, Buffer.Length)
                Dim entry As New ZipEntry(Dir.FullName.Replace(parentPath, "") + "/" + fi.Name)
                entry.Size = fs.Length
                fs.Close()
                s.PutNextEntry(entry)
                s.Write(Buffer, 0, Buffer.Length)
            Next
        End Sub
    ich hoffe mal das dies etwas hilft.
    MfG Cecil
     

Ähnliche Themen

  1. Mit Ionic zippen
    Von Perserhood im Forum .NET Café
    Antworten: 4
    Letzter Beitrag: 31.03.10, 12:40
  2. Ordner zippen
    Von Saskia21 im Forum Java
    Antworten: 1
    Letzter Beitrag: 29.02.08, 16:34
  3. Antworten: 1
    Letzter Beitrag: 01.02.08, 11:38
  4. Zippen mit Struktur Panne
    Von lusiphur im Forum .NET Datenverwaltung
    Antworten: 3
    Letzter Beitrag: 06.06.07, 16:35
  5. Dateien zippen
    Von Yamah im Forum PHP
    Antworten: 2
    Letzter Beitrag: 15.09.04, 11:22