vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2021
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Visual-Basic Einsteiger
ZIP-Datei erstellen, die leere Ordner enthält 
Autor: DustyD.
Datum: 10.04.21 20:26

Hallo Forum,

folgendes Problem: Ich möchte (möglichst unkompliziert, da nicht sooo fit in VB6) eine ZIP-Datei erstellen. Mit etwas Googlei habe ich folgenden Code zusammen geschustert:

Dim gemPfadVariant as Variant 'zu zippende Dateien und Ordner
Dim VerzeichnisZIP as Variant 'zu erstellendes ZIP-File
Dim SHELL2 As Object
Set SHELL2 = CreateObject("Shell.Application")
 
gemPfadVariant = "c:\zuZippendeDateien und Ordner"
VerzeichnisZIP = "d:\zip-datei.zip"
 
FileNr = FreeFile
Open VerzeichnisZIP For Output As #FileNr
Print #FileNr, Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, Chr$(0)); _
  'Header für ZIP-Datei
Close #FileNr
 
SHELL2.Namespace(VerzeichnisZIP).CopyHere SHELL2.Namespace( _
  gemPfadVariant).Items 'ZIP-Datei befüllen
Set SHELL2 = Nothing
Läuft so weit; wenn das zu zippende Verzeichnis allerdings einen leeren Ordner enthält, erhalte ich die Meldung "[ZIP-komprimierte Ordner]Mindestens ein leeres Verzeichnis konnte dem ZIP-komprimierten Ordner nicht hinzugefügt werden."

Lasse ich das ".items" weg, werden auch die leeren Ordner dem ZIP-File hinzugefügt, allerdings habe ich dann das Problem, dass im Root der ZIP-Datei erstmal ein Ordner "c:\zuZippendeDateien und Ordner" steht und erst darunter die eigentlichen Ordner und Verzeichnisse.

Gibt es eine Möglichkeit, ins Root der ZIP-Datei direkt den vollständigen Inhalt von "gemPfadVariant" zu schreiben und zwar mit allen Unterverzeichnissen, auch den leeren?

Ich hoffe, ich habe mich verständlich ausgedrückt...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ZIP-Datei erstellen, die leere Ordner enthält 
Autor: -Franky-
Datum: 11.04.21 18:27

Hi

Du nutzt im Prinzip die in Windows eingebaute ZIP-Funktionalität (Komprimierter Ordner). Das was Du machen möchtest, kann nicht einmal der Windows Explorer selber. Im Root der ZIP kann kein leerer Ordner erstellt werden. Deswegen die Fehlermeldung. Entweder verwendest eine andere Komponente (DLL, OCX) die zippen kann oder Du kopierst den Ordner, den Du zippen möchtest, zuerst in einen anderen Ordner (zB. TmpZip) und gibst in gemPfadVariant diesen TmpZip-Ordner an. Dann werden auch leere Ordner in der ZIP angelegt wobei der Root dann in der ZIP der ursprüngliche Ordner ist, den Du eigentlich zippen wolltest.

Mit freundlichen Grüßen
-Franky-

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ZIP-Datei erstellen, die leere Ordner enthält 
Autor: DustyD.
Datum: 11.04.21 22:02

Hallo Franky,

und danke für Deine Antwort. Die Idee mit dem Kopieren hatte ich auch schon, aber wieder verworfen, weil ich davon ausgegangen bin, dass mir das nicht weiter hilft:

Wenn ich den Inhalt von "c:\zuZippendeDateien und Ordner" nach "TmpZIP" kopiere und dann den Ordner "TmpZIP" zippe, dann habe ich im Root der ZIP-Datei doch "TmpZIP" stehen und darunter dann den eigentlichen Inhalt oder stehe ich da grad auf dem Schlauch?

Oder meinst Du, dass ich nicht nur den Inhalt, sondern den ganzen Ordner kopieren soll, sodass TmpZIP so aussieht: "\\tmpzip\zukopierende Dateien und Ordner\leerer Ordner"? Das kann ich wie gesagt auch erreichen, indem ich das ".items" im obigen Beispiel weglasse.

Aber wenn, wie Du schreibst, im Root einer ZIP-Datei per Definition kein leerer Ordner sein darf, wird das vermutlich auch nicht mit externen Tools gehen, oder? Und selbst wenn, würde ich mein ZIP-File damit nicht ggfs. inkompatibel zu anderen Programmen machen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ZIP-Datei erstellen, die leere Ordner enthält 
Autor: -Franky-
Datum: 11.04.21 22:52

Hi

Zitat:


Oder meinst Du, dass ich nicht nur den Inhalt, sondern den ganzen Ordner kopieren soll, sodass TmpZIP so aussieht: "\\tmpzip\zukopierende Dateien und Ordner\leerer Ordner"?

Genau das hab ich gemeint. In der Zip schaut das dann so aus ZIP\zukopierende Dateien und Ordner\leerer Ordner.

Zitat:


Aber wenn, wie Du schreibst, im Root einer ZIP-Datei per Definition kein leerer Ordner sein darf, wird das vermutlich auch nicht mit externen Tools gehen, oder?

Da hast etwas falsch verstanden. Die in Windows eingebaute ZIP-Funktionalität kann keine leeren Ordner im Root erstellen. Ansonsten ist es erlaubt. 7-Zip zB. kann es problemlos. Windows kann auch leere Ordner im Root lesen, halt nur selbst keine erstellen.

Zitat:


Und selbst wenn, würde ich mein ZIP-File damit nicht ggfs. inkompatibel zu anderen Programmen machen?

ZIP ist ja sowas wie ein Standard. Von daher sollten keine Probleme mit anderen Programmen auftreten, die ebenfalls ZIPs erstellen und lesen können.

Mit freundlichen Grüßen
-Franky-

Beitrag wurde zuletzt am 11.04.21 um 22:54:16 editiert.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ZIP-Datei erstellen, die leere Ordner enthält 
Autor: DustyD.
Datum: 14.04.21 18:15

Okay, das Ergebnis kann ich wie gesagt auch ohne vorheriges Kopieren des zu zippenden Ordners erreichen.

Ich hab das Web nun rauf und runter gesucht nach alternativen Lösungen, Info-Zip schien mir die geeignetste zu sein (es kommen nur Freeware-Lösungen in Betracht, da meine Software ebenfalls Freeware ist). Allerdings laufen alle gefühlt 100 getesten Links ins Leere, einschl. die auf deren Website und Sourceforge-Seite.

Ich denke, ich werde nun einfach damit leben, dass ich im Root des ZIP-Files einen Ordner habe und darunter dann die eigentliche Datei- und Ordner-Struktur. Da das Ganze als Backup-Funktion dienen soll, kann ich beim Rücksichern über die Software ja dann in einen Temp-Ordner entpacken und die entpackten Dateien und Verzeichnisse dann an ihren ursprünglichen Zielort schieben. Nicht besonders elegant, aber was hilft's...

Danke jedenfalls für die Aufklärung bzgl. Windows-Funktionalität!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ZIP-Datei erstellen, die leere Ordner enthält 
Autor: -Franky-
Datum: 14.04.21 21:52

Hi

Du kannst Dir ja mal dieses Projekt hier anschauen: https://github.com/wqweto/ZipArchive
Das ganze läuft unter einer MIT-Lizenz. Wenn Du diese ZIP auspackst, findest Du einen Ordner ZipArchive-master\test\basic mit einem Testprojekt. Für Dich dürfte der Command5 von Interesse sein. Pass den Code in diesem Button entsprechend an.
Private Sub Command5_Click()
 
    Dim dblTimer        As Double
    Dim bResult         As Boolean
    Dim sLastError      As String
'    Dim baOutput()      As Byte
'    Dim oBuffer         As cBufferStream
 
    dblTimer = Timer
    Set m_oZip = New cZipArchive
    m_bCancel = False
    With m_oZip
        .AddFromFolder "C:\DeinOrdner\", Recursive:=True, _
          IncludeEmptyFolders:=True
'        ReDim baOutput(0 To 100000000) As Byte
'        Set oBuffer = New cBufferStream
'        oBuffer.Init VarPtr(baOutput(0)), UBound(baOutput) + 1
'        bResult = .CompressArchive(oBuffer)
        bResult = .CompressArchive("C:\test.zip", Level:=9)
        'Debug.Assert FileLen("C:\test.zip") = oBuffer.Size
        sLastError = .LastError
    End With
    Set m_oZip = Nothing
    labProgress.Caption = IIf(bResult, "Done. ", sLastError & ". ") & Format( _
      Timer - dblTimer, "0.000") & " elapsed"
 
End Sub
Damit kannst einen Ordner, der auch leere Ordner enthält (IncludeEmptyFolders) in eine ZIP packen. Leere Ordner gehen so auch im Root.

Mit freundlichen Grüßen
-Franky-

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ZIP-Datei erstellen, die leere Ordner enthält 
Autor: DustyD.
Datum: 18.04.21 20:17

Hi Franky,

ja, das sieht echt gut aus. Hab's grad mal ausprobiert: Ist (zumindest in der IDE) etwas langsamer als das Windows-eigene Teil und komprimiert scheinbar nicht ganz so gut (aus 6,79 GB werden 1,54 GB, bei Windows: 1,35 GB), aber dafür kann ich eine vernünftige Fortschrittsanzeige und eine Abbruch-Funktion einbauen und muss mich nicht mit diesem asynchronen Zeugs rumschlagen. Und die Lizenz passt auch.

Vielen herzlichen Dank, das war echt ein toller Tipp!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2021 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel