ERLEDIGT
NEIN
NEIN
ANTWORTEN
15
15
ZUGRIFFE
8049
8049
EMPFEHLEN
-
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
-
01.03.04 20:32 #2
- 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,
AlexWith 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
-
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.
-
20.07.05 16:14 #4
- 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,
AlexWith 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
-
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
-
20.07.05 18:14 #6
- 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
-
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
-
Habs rausgefunden.
Danke
-
15.03.07 18:31 #9
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:
Ersetzt diese Zeile mit den folgenden:Code :1
ZipEntry entry = new ZipEntry(dir.FullName.Replace(parentPath,"") + "/" + fi.Name);
Nun werden auch die Odner in den Rootverzeichnissen relativiert.Code :1 2
string relativPath = ZipEntry.CleanName(dir.FullName.Replace(parentPath,"") + "/" + fi.Name); ZipEntry entry = new ZipEntry(relativPath);
Gruß,
Asterix
-
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
-
16.04.07 09:34 #11
- 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
-
So hab es schon gefunden! Trotzdem Danke!
Hatte ein kleines Deklarierungsproblem!
Mfg ECP
-
Hey!
Wie müsste ich den code abändern, um nur eine Datei ohne Ordner zu Zippen?
Mfg ECP
-
22.12.07 23:26 #14
- 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?
-
30.09.08 10:59 #15
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
ich hoffe mal das dies etwas hilft.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
MfG Cecil
Ähnliche Themen
-
Mit Ionic zippen
Von Perserhood im Forum .NET CaféAntworten: 4Letzter Beitrag: 31.03.10, 12:40 -
Ordner zippen
Von Saskia21 im Forum JavaAntworten: 1Letzter Beitrag: 29.02.08, 16:34 -
Ist Zippen mit java.util.zip wie zippen mit Zipprogrammen
Von Java? im Forum JavaAntworten: 1Letzter Beitrag: 01.02.08, 11:38 -
Zippen mit Struktur Panne
Von lusiphur im Forum .NET DatenverwaltungAntworten: 3Letzter Beitrag: 06.06.07, 16:35 -
Dateien zippen
Von Yamah im Forum PHPAntworten: 2Letzter Beitrag: 15.09.04, 11:22





Zitieren

Login




