Zippen mit VB5 ( Batch umschreiben )

  • VB6

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Zippen mit VB5 ( Batch umschreiben )

    Hallo

    Ich brauche Eure Hilfe.
    Ich habe seit langer Zeit eine Batch die mir einiges zippt. ( Worddateien, jede Datei in eine separate zip muss so sein!! )

    Die batch in eckiger Klammer
    [..... FOR /F "TOKENS=*" %%I IN ('DIR /S /B "F:\*.doc"') DO ( C:\Programme\7-Zip\7za.exe a %%I.zip %%I -sdel ) ......]

    Das fukntioniert auch soweit auch gut, nur das ich die Bat immer auf die jeweilige Platte kopieren muss.
    Ich würde das gerne mit einem kleinen VB5 Programm lösen.

    Einfach über Laufwerksauswahl und einem Button ggf noch auswählen ob die Ursprünglichen Daten gelöscht werden sollen.
    Und Ohne das Konsolenfenster.
    Ich hab schon etwas mit einer zip-Rotine gefunden, werde daraus aber nicht schlau. ?(

    Mein Weiteres Problem ist: Ich habe hier nur einen Windows 7 / 64Bit PC mit VisualBasic 5 und kann an diesem NICHTS ändern.
    Die neuen .Net Versionen laufen nicht ( Absturz schon beim Starten )

    Vielleicht ist hier jemand so nett und hilft mir dabei. :)

    Liebe Grüße Amelie

    .
    .
    Der Codeschnipsel:

    Quellcode

    1. Private Const Quelldokument As String = "C:\TEMP\Test.txt"
    2. Private Const ZIP As String = "C:\TEMP\Test.zip"
    3. Private ZIPHeader As String
    4. Public Sub Zip_komprimieren(ByVal Quelldatei, ByVal Zipdatei)
    5. Dim SHELL As Object
    6. Set SHELL = CreateObject("Shell.Application")
    7. CreateEmptyZip Zipdatei
    8. SHELL.Namespace(Zipdatei).CopyHere Quelldatei
    9. Set SHELL = Nothing
    10. End Sub
    11. Private Sub CreateEmptyZip(ByVal Zipdatei As String)
    12. ZIPHeader = Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, Chr$(0))
    13. Open Zipdatei For Output As #1
    14. Print #1, ZIPHeader;
    15. Close #1
    16. End Sub
    17. Private Sub butZIP_Click()
    18. Zip_komprimieren Quelldokument, ZIP
    19. MsgBox "fertig"
    20. End Sub

    ---
    Das habe ich mir schon zusammen geschrieben.

    Bilder
    • form1.jpg

      37,19 kB, 390×285, 10 mal angesehen

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Amelie“ ()

    Deinen Weg über .CopyHere kenne ich nur zum Entpacken von ZIPs.
    Und vermutlich ist damit auch Ende.

    Amelie schrieb:

    FOR /F "TOKENS=*" %%I IN ('DIR /S /B "F:\*.doc"') DO ( C:\Programme\7-Zip\7za.exe a %%I.zip %%I -sdel )
    Das funktioniert auch soweit auch gut, nur das ich die Bat immer auf die jeweilige Platte kopieren muss.
    Teile diese BAT-Befehlskette auf.
    1. Hol dir die Dateien mit VB einzeln in einer Schleife über das FileSystemObject.
    2. Erzeuge damit eine 7-Zip Kommandozeile, die du durch das Shell-Objekt ausführst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich habe nun einmal folgendes gemacht. Das Testverzeichnis ist vorhanden. Programm läuft aber es tut sich nichts.
    Keine Fehlermeldung aber es wird auch nichts gezippt.

    Bitte wer kann helfen.
    Danke lg Amelie

    Quellcode

    1. Private Sub Command1_Click()
    2. 'alle in einem Verzeichnis befindlichen Dateien einzeln Zippen!
    3. Dim sDatei As String
    4. Dim sPfad As String
    5. Dim zipName As String
    6. sPfad = "E:\Test\" 'hier den Pfadnamen eingeben, bzw ändern!
    7. ChDrive sPfad
    8. ChDir sPfad
    9. sDatei = Dir("*.doc")
    10. Do While sDatei <> ""
    11. Label1.Caption = sDatei 'Welche Datei wird gezipt
    12. zipName = Left(sDatei, Len(sDatei) - 4) & ".zip"
    13. Shell "c:\programme\7-Zip\7za.exe -min -a " & sPfad & zipName & sDatei
    14. sDatei = Dir
    15. Loop
    16. End Sub
    Also es zippt nun ABER

    Für jede Datei geht ein separates Konsolenfenster auf.

    Kann man das ändern, so das nur eine Konsole aufgeht?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Amelie“ ()

    Warum funktioniert hier der Schalter " -r " nicht? Soll heißen, das Unterverzeichnisse jetzt NICHT gezipt werden.
    Hmm Ratlos bin

    Quellcode

    1. Shell "c:\programme\7-Zip\7za.exe a -r " & sPfad & zipName & " " & sDatei, vbHide
    Hey ;)
    Ich habe alle Möglichkeiten mit dem " -r " ausgetestet.
    Es soll im Root begonnen werden und dann alle Unterordner ... und immer wenn deine entsprechende *.doc gefunden wird soll diese gezipt werden.

    Ich glaube das mit der Shell ist nicht das wahre oder???


    @ Erfinderdesreaders: evtl. kannste auch beim Shell.CopyHere()-Verfahren bleiben?Ich hab damit immer fröhlich gezippt und geunzippt, und war dabei unabhängig von 7zip.Ich teste gerade damit herum bekomme aber im Moment nur leere Zips.
    @Amelie Du kannst doch Dein VB5-Programm eine Batch schreiben lassen und die dann über VB5 starten?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Amelie schrieb:

    Wenn ich wüste wie ....
    Die kompletten Zeilen hast Du vorrätig, Quelle und Ziel als Platzhalter.
    Das kannst Du dann sogar in einer kleinen GUI visualisieren, mit nem Start-Button und feddich.
    Ich weiß, dass es geht, allerdings kann ich nicht mit VB5-Syntax dienen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Amelie schrieb:

    Ich teste gerade damit herum bekomme aber im Moment nur leere Zips.
    Ich hab nur eine Version in vb.net:

    VB.NET-Quellcode

    1. Private Sub ShellCopy(ByVal source As String, ByVal destination As String)
    2. ' Für die Shell sind Zip-Dateien einfach Datei-Ordner
    3. ' Zippen/UnZippen ist also ein simpler Kopier-Vorgang von einen in den anderen ShellFolder
    4. If _shell Is Nothing Then _shell = DirectCast(CreateObject("Shell.Application"), Shell32ZipOnly.IShellDispatch)
    5. Dim dst = _shell.NameSpace(destination)
    6. Dim src = _shell.NameSpace(source)
    7. Dim itms = src.Items
    8. dst.CopyHere(itms)
    9. 'Com-Objekte sind speziell aufzuräumen - beachte auch die Reihenfolge
    10. FinalReleaseComObject(itms)
    11. FinalReleaseComObject(src)
    12. FinalReleaseComObject(dst)
    13. End Sub
    Aber man erkennt, dass ich zwei Shell-Objekte brauche: Quelle und Ziel. Aus der Quelle rufe ich die Items ab, welche ich mit .CopyHere ins Ziel kopiere.
    Der Vorgang ist bidirektional, also fürs Shell-Objekt ists egal, ob das eine Ordner ist oder eine ZipDatei.
    Wenn ich also die zip als Ziel angebe und einen Ordner als Quelle, dann zippts, und wenn andersrum dann andersrum.
    Nein, das ist nur um das Prinzip zu verdeutlichen:
    1. Es ist eine Methode ShellCopy(ByVal source As String, ByVal destination As String) zu schreiben
    2. Dort ist mit zwei shell-Namespaces zu arbeiten
    3. vom Quell-Namespace die Items abrufen
    4. Ziel-Namespace.CopyHere(items)
    Der FinalRelease-Kram ist für vb5 nicht relevant
    Dann erstellste dir wie in post#1 eine Zip-Datei.
    Und nun kannste mit ShellCopy in diese Zip-Datei hinein-kopieren oder daraus herauskopieren - die wird einfach wie ein Ordner-Pfad angegeben.

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

    Amelie schrieb:

    da ich gerade erst anfange kann ich mit .Net so garnichts anfangen
    Wenn du gerade erst anfängst, solltest du nicht mit einer Programmiersprache arbeiten, die vor 20 Jahren schon tot war.

    Ich bin davon überzeugt, dass auch eine .Net-Anwendung unter Win7/64 zum Rennen kommt.
    Ich hatte jahrelang dieselbe Umgebung und das war nie ein Problem.

    Du wirst für VB5 wenig Support kriegen.
    Die Leute, die darauf noch programmiert haben, sind längst auf modernen Plattformen unterwegs.
    Das Wissen ist nur noch in den hinteren Hirnwindungen vorhanden.
    Testumgebung dafür gibt's auch kaum noch.

    Und so wie du dich bisher angestellt hast, benötigst du wohl Hilfe.
    Denk darüber nach, auf aktuelle Technik zu setzen, dann ist die Chance für Hilfe wesentlich höher.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod
    Ich habe wirklich einige .Net Versionen versucht zu installieren.
    VB Exrpess 2005 / 2008 / 2010 / immer mit dem selben Resultat.
    Sobald ich die Anwendung starte, stürzt das Programm ab.

    --
    Zu meinem Problem:
    Ich habe es mittlerweile hinbekommen, das mir eine Zip mit dem Original Dateinamen erstellt wird.
    Im Moment ist es noch so, das ich die zu zippende Datei im Code angeben muss.
    Ich versuche mich gerade darin das ich die Datei per Auswahl angeben kann.

    --

    Quellcode

    1. Private ZIPHeader As String
    2. Dim Quelle As String
    3. Dim ZIP As String
    4. Dim sDatei As String
    5. Dim sPfad As String
    6. Private Sub Form_Load()
    7. Quelle = "E:\Tfp.doc" 'Die zu zippende Datei
    8. End Sub
    9. Public Sub Zip_komprimieren(ByVal Quelldatei, ByVal Zipdatei)
    10. sDatei = Quelle
    11. 'ZIP = Left(sDatei, Len(sDatei) - 4) & ".doc" 'Mit original Endung
    12. ZIP = Left(sDatei, Len(sDatei) - 4) 'Ohne original Endung
    13. Zipdatei = ZIP & ".zip"
    14. Dim SHELL As Object
    15. Set SHELL = CreateObject("Shell.Application")
    16. CreateEmptyZip Zipdatei
    17. SHELL.Namespace(Zipdatei).CopyHere Quelldatei
    18. Set SHELL = Nothing
    19. L_Pfad.Caption = sPfad 'Zeigt später das Laufwerk an
    20. L_quelle.Caption = Quelle 'Zeigt die zu zippende Datei
    21. L_ziel.Caption = Zipdatei 'Zeigt die gezipte Datei
    22. End Sub
    23. Private Sub CreateEmptyZip(ByVal Zipdatei As String)
    24. ZIPHeader = Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, Chr$(0))
    25. Open Zipdatei For Output As #1
    26. Print #1, ZIPHeader;
    27. Close #1
    28. End Sub
    29. Private Sub bZippen_Click()
    30. Zip_komprimieren Quelle, ZIP
    31. MsgBox "Erfolgreich"
    32. End Sub

    Amelie schrieb:

    Sobald ich die Anwendung starte, stürzt das Programm ab.
    Die komplette Prozedur des Quellcodes, Markierung der betroffenen Zeile, genaue Fehlermeldung?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!