| |
Visual-Basic EinsteigerZIP-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... | |
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- | |
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? | |
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. | |
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! | |
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- | |
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! | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere Infos
|