Zip/Unzip

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14219
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 7 Mal
Danksagung erhalten: 35 Mal
Kontaktdaten:

Zip/Unzip

Beitrag von Jan »

Moin,

es gibt hier im Forum diverse DIskussionen darum, wie man mit zip-Archiven umgehen kan. Meist wird dabei auf die XbZLib von Phil verwiesen, die inzwischen von Andreas gepflegt wird.

Nun stellt sich mir die Frage ob man nicht die seit Jahren schon von Windows bereit gestellte Funktion nutzen kann. Per API-Aufruf oder sonst wie. Das müsste doch eigentlich machbar sein.

Mir geht es dabei im Moment nur um die fundamentalen Grundfunktionen, also kein Passwortschutz etc.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8559
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 26 Mal
Danksagung erhalten: 104 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von Tom »

Das ist die "Compressions API" von Windows. Interessanter Gedanke, das direkt zu nutzen.

https://docs.microsoft.com/en-us/window ... ion-portal
Herzlich,
Tom
Benutzeravatar
Marcus Herz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 445
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 15 Mal
Danksagung erhalten: 70 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von Marcus Herz »

Code: Alles auswählen

//=========================================
FUNC Unzip(cZipFile, cDestFolder)
	LOCAL oShell, oZIP, oNameDest

   oShell    := CreateObject("Shell.Application")
   oZIP  := oShell:NameSpace(cZipFile)
   oNameDest := oShell:NameSpace(cDestFolder)
   oNameDest:CopyHere(oZIP:items(), 0x10)
   oShell:destroy()

RETURN NIL
So extrahiere ich Dateien über Windows. Wahrscheinlich geht auch Zippen, hab ich nur noch nicht gebraucht
Gruß Marcus

Es gibt keine Grenzen, aber du kannst welche ziehen.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14219
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 7 Mal
Danksagung erhalten: 35 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von Jan »

Hallo Marcus,

holla die Waldfeee! Das ist ja super. Und super simpel.

Das Einzige das mich daran stört ist, das da der übliche riesige Windows-Fortschritt angezeigt wird. Das sollte ja besser im Programm generiert werden, oder ganz weg sein. Aber wie egsagt - ich bin schon mal durchaus begeistert.

Jetzt muß ich das noch im Detail verstehen um darüber dann herausfinden, wie der umgekehrte Weg geht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14219
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 7 Mal
Danksagung erhalten: 35 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von Jan »

OK, erste Frage scheint beantwortet. Marcus, Du baust da als Parameter 0x10 = 16 ein. 16 heißt: "Alle Fragen mit Ja beantworten". Es gibt noch den Wert 4 "Keinen Statusdialog anzeigen". Wenn ich das aufaddiere müsste das doch eigentlich passen.

Schauen wir mal...

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14219
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 7 Mal
Danksagung erhalten: 35 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von Jan »

Jupp, klappt.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 608
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 2 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von Muecke »

Hallo Jan

Wie sieht nun deine Lösung aus ?
Kann man damit auch alle Unterordner mit einbeziehen ?

Schöne Grüsse
Thomas
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14219
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 7 Mal
Danksagung erhalten: 35 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von Jan »

Hallo Thomas,

Du meist das zippen? Soweit bin ich noch nicht. Ich glaube ich habe den Weg dazu gefunden, werde das aber wohl erst am Samstag ausprobieren können.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 608
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 2 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von Muecke »

Hallo Jan

Ja .

Schöne Grüsse
Thomas
Dominik Krebs
UDF-Programmierer
UDF-Programmierer
Beiträge: 96
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 1 Mal
Danksagung erhalten: 3 Mal

Re: Zip/Unzip

Beitrag von Dominik Krebs »

Sehr interessant,
Ich klemme mich mal mit hier dran :)
Gruß Dominik
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14219
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 7 Mal
Danksagung erhalten: 35 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von Jan »

OK, hab jetzt doch schon auch das zippen gelöst. Das ist im Prinzip exakt die Funktion oben von Marcus. Nur das die Parameter halt vertauscht werden müssen:

Code: Alles auswählen

oShell          := CreateObject("Shell.Application")
oZipVerzeichnis := oShell:NameSpace(cZuZipendesVerzeichnis)
oZIP            := oShell:NameSpace(cZipArchiv)
oZIP:CopyHere(oZipVerzeichnis:items(), cHex)    // Ich hab hier cHex variabel gemacht, Marcus hatte da statisch für seine Bedürfnisse ein 0x10 drin stehen
oShell:destroy()
Wichtig ist:
  • Anscheinend müssen alle Dateien, die in das Archiv kopiert werden müssen, in einem Verzeichnis liegen. Das dann komplett mit allem Inhalt in die Zip gepackt wird.
  • Die Datei cZipArchiv muß vorher z. B. per FCreate() erstellt worden sein.
Ich werde aber in den kommenden Tagen da noch mal mit rumspielen, z. B, um zu schauen ob das wirklich nur verzeichnisweise geht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12634
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 15 Mal

Re: Zip/Unzip

Beitrag von AUGE_OHR »

hi,

das Thema habe ich 2014 hier im Forum gebracht
https://www.xbaseforum.de/viewtopic.php ... ere#p56785

... das bekommt man natürlich nur mit wenn man Artikel "von mir" liest

---

"CopyHere" läuft asynchron d.h. die App konnte beendet werden bevor alles "ge-ziped" wurde.
es "fehlt " also der entscheidende Teil ...
gruss by OHR
Jimmy
Benutzeravatar
Marcus Herz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 445
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 15 Mal
Danksagung erhalten: 70 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von Marcus Herz »

Stimmt Jimmy
Ich hab das glaub ich von dir. Will mich nicht mit fremden Federn schmücken
Gruß Marcus

Es gibt keine Grenzen, aber du kannst welche ziehen.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14219
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 7 Mal
Danksagung erhalten: 35 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von Jan »

... wobei man sagen muß, da sich Jimmys Thread durchaus gefunden hatte bei meiner Suche nach Alternativen. Der fing aber dermaßen verquast und kompliziert an mit C-Code oder sowas, das ich nach zwei oder drei Beiträgen aufgegeben habe das weiter zu lesen. Das dann ganz unten eine Xbase++-Lösung in relativ wenigen Codezeilen kam hab ich damit dann nicht mehr gesehen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 608
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 2 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von Muecke »

Hallo Jimmy

zum verschlüsseln hast du da auch noch was in deiner
Trickkiste ?

Gruss
Thomas
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2265
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 10 Mal
Danksagung erhalten: 38 Mal

Re: Zip/Unzip

Beitrag von ramses »

Muecke hat geschrieben: Fr, 02. Jul 2021 11:58 zum verschlüsseln hast du da auch noch was in deiner Trickkiste ?
Das geht leider Anhand der Unterlagen von M$ auf diese Art und Weise nicht.

Wäre aber auch auf eine Lösung gespannt.
Valar Morghulis

Gruss Carlo
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15492
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 30 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von brandelh »

Bei der Microsoft API frage ich mich ob die zuverlässiger ist als die ZIP Funktion des Explorers.
Leider hatte ich schon Fehler beim ZIPPen und auch beim entZIPPen mit der Explorer Version.

Ich nehme nur noch 7zip als Programm.
Gruß
Hubert
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 359
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 2 Mal

Re: Zip/Unzip

Beitrag von azzo »

Hallo,
ich nutze problemlos seit Jahren 7z.exe

DCOM := '7Z.exe X ' + cDst + cBackupFile + " -o" + cDst + "temp" + " -pmeinPasswort"
WAITRUN(DCOM,0)

LG
Otto
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14219
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 7 Mal
Danksagung erhalten: 35 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von Jan »

Otto,

das war nicht die Frage. Mir ging es ausdrücklich darum externe Bibliotheken zu vermeiden.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15492
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 30 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Zip/Unzip

Beitrag von brandelh »

azzo hat geschrieben: Fr, 02. Jul 2021 23:45 Hallo,
ich nutze problemlos seit Jahren 7z.exe

DCOM := '7Z.exe X ' + cDst + cBackupFile + " -o" + cDst + "temp" + " -pmeinPasswort"
WAITRUN(DCOM,0)

LG
Otto
was ist waitrun() ?
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12634
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 15 Mal

Re: Zip/Unzip

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: Fr, 02. Jul 2021 23:24 Bei der Microsoft API frage ich mich ob die zuverlässiger ist als die ZIP Funktion des Explorers.
die COPYHERE API ist "die" welche der Explorer zum packen/entpacken nutzt.

die SHFileOperation API ist für das File-System wie es auch Windows nutzt
inzwischen gibt es das iFileOperation Interface was das selbe System benutzt.

---

bei selben Windows Versionen "sollte" es keine Probleme geben z.b. "fremde" Zeichen
man muss dann "nur" das entsprechende Sprach-Paket installieren damit es ohne Fehler läuft.

---

Windows kann ein ZIP Files mit Passwort "entpacken" aber leider nicht "verpacken"
... aber man kann ja den "Inhalt" verschlüsseln

p.s. COPYHERE kann man auch nutzen um z.b. Fotos vom iPhone, was sich als Device nicht Laufwerk meldet, auf den PC zu übertragen
gruss by OHR
Jimmy
Dominik Krebs
UDF-Programmierer
UDF-Programmierer
Beiträge: 96
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 1 Mal
Danksagung erhalten: 3 Mal

Re: Zip/Unzip

Beitrag von Dominik Krebs »

Hallo Jimmy,
Hast du denn zufällig ein Beispiel um auf ein mobil Gerät zuzugreifen?
Das finde ich überaus interessant 😬
Gruß Dominik
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12634
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 15 Mal

Re: Zip/Unzip

Beitrag von AUGE_OHR »

hi,
Dominik Krebs hat geschrieben: Mo, 05. Jul 2021 20:26 Hast du denn zufällig ein Beispiel um auf ein mobil Gerät zuzugreifen?
Das finde ich überaus interessant 😬
ich stelle gerade fest das ich das Modul nicht mit Xbase++ geschrieben habe.

ich habe es unter harbour mit HMG Controls, die nicht Xbp heissen, geschrieben
die "semi" OOP Syntax ist anders und ähnelt eher Express++ und arbeitet mit Function

aber der ActiveX Teil um den es geht ist 100% Syntax kompatible

Code: Alles auswählen

PROCEDURE SearchDevice()
LOCAL cName, oItems
LOCAL i, iMax
LOCAL xParent

   nLevel := 1
   xParent := nLevel

   oShell := CreateObject( "shell.application" )
   IF NIL <> oShell
      oFolder := oShell:NameSpace( CSIDL_DRIVES )                     // 0x0011 // My Computer
      IF NIL <> oFolder
         oItems := oFolder:Items()
         iMax := oItems:Count
         FOR i := 1 TO iMax
            oFolderItem := oItems:Item( i - 1 )
            IF !EMPTY( oFolderItem )
               cName := UPPER( oFolderItem:name )
               IF cName = "DESKTOP"
                  LOOP
               ENDIF
               IF ASCAN( aFolder, { | e | e[ ID_Name ] = cName .AND. e[ ID_Level ] = nLevel } ) > 0
               ELSE
                  nElement ++

                  // "nur" die Tree Darstellung mit HMG "semi" OOP Syntax
                  IPHONE.Tree_1.AddItem( cName, nLevel, nElement )            // nLevel := 1
                  IPHONE.Tree_1.CARGO( nElement ) := { cName, nLevel + 1 } // next Level Action
                  IPHONE.Tree_1.NodeFlag( nElement ) := .T.
                  //  IPHONE.Tree_1.ImageIndex ( nElement ) := { IMAGE_FOLDER_UNCHECKED, IMAGE_FOLDER_UNCHECKED }
                  IPHONE.Tree_1.ImageIndex( nElement ) := IsRealDrive( oFolderItem )

                  // diese Array werden benütigt                  
                  AADD( aFolder, { oFolderItem, cName, nLevel + 1, xParent, nElement } )
                  AADD( aDevices, oFolderItem )

                  IF .NOT. oFolderItem:isFileSystem
                     AADD( aFileSys, i )
                  ENDIF
               ENDIF
            ENDIF
         NEXT
      ENDIF
   ENDIF
   
   // harbour HMG 
   DO EVENTS

RETURN
das COPYHERE / MOVEHERE

Code: Alles auswählen

PROCEDURE DoCopySingle( oDirFolder, cTarget, lMove )
LOCAL hGrid   := GetControlHandle( "Grid_1", "IPHONE" )
LOCAL oNewSH  := CreateObject( "Shell.Application" )
LOCAL oTarget := oNewSH:NameSpace( cTarget )
LOCAL xFlag   := FOF_SIMPLEPROGRESS
LOCAL aFiles  := {}
LOCAL oFile, cFile, xCount, nCount
LOCAL i, iMax, nSkip := 0
LOCAL nState  := hb_BitOr( LVIS_SELECTED, LVIS_FOCUSED )
LOCAL nMask   := hb_BitOr( LVIS_SELECTED, LVIS_FOCUSED )

   DEFAULT lMove TO .F.

   IPHONE.ProgressBar_1.Value := 0
   TBL_SETVALUE( ThisWindow.Handle, 0, 100 )

   iMax := oDirFolder:Count
   FOR i := 1 TO iMax

      IPHONE.ProgressBar_1.Value := CalcPos( i, iMax )
      TBL_SETVALUE( ThisWindow.Handle, CalcPos( i, iMax ), 100 )
      DO EVENTS

      // if Checkbox is marked
      IF IPHONE.Grid_1.CheckBoxItem( i ) = .T.

         // get Item Object
         oFile := oDirFolder:Item( i - 1 )

         IF lMove = .T.
            // move single Object file
            oTarget:MoveHere( oFile, xFlag )
         ELSE
            // copy single Object file
            oTarget:CopyHere( oFile, xFlag )
         ENDIF

         // wait until all files are written
         xCount := 0
         DO WHILE .T.
            // compare if file is written
            nCount := oTarget:items() :Count()
            IF nCount + nSkip >= i
               EXIT
            ENDIF
            hb_idleSleep( 0.1 )
            xCount ++
            IF xCount > 50
               EXIT
            ENDIF
         ENDDO

         // this Syntax give Error ?
         // IPHONE.Grid_1.CheckBoxItem( i ) = .F.
         // so use this Syntax
         SetProperty( "IPHONE", "Grid_1", "CheckBoxItem", i, .F. )

         // scroll GRID if need
         LISTVIEW_SETITEMSTATE( hGrid, i, nState, nMask )
         ListView_EnsureVisible( hGrid, i )
      ELSE
         // Skip un-maked
         nSkip ++
      ENDIF
   NEXT
   // clean up
   hb_idleSleep( 0.5 )
   IPHONE.ProgressBar_1.Value := 0
   TBL_SETVALUE( ThisWindow.Handle, 0, 100 )
   oTarget := NIL
   oNewSH := NIL
   
   // harbour HMG
   DO EVENTS

RETURN
HBFM_IPHONE.jpg
HBFM_IPHONE.jpg (143.17 KiB) 2115 mal betrachtet
den ganze HMG Source und 32 / 64 Bit EXE findet man hier
https://github.com/AugeOhr/HBFM
gruss by OHR
Jimmy
Dominik Krebs
UDF-Programmierer
UDF-Programmierer
Beiträge: 96
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 1 Mal
Danksagung erhalten: 3 Mal

Re: Zip/Unzip

Beitrag von Dominik Krebs »

Das ist wirklich klasse, jetzt habe ich viel zum experimentieren 😁
Vielen Dank!
Gruß Dominik
Antworten