Seite 1 von 1

Zip/Unzip

Verfasst: Do, 01. Jul 2021 11:57
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

Re: Zip/Unzip

Verfasst: Do, 01. Jul 2021 12:38
von Tom
Das ist die "Compressions API" von Windows. Interessanter Gedanke, das direkt zu nutzen.

https://docs.microsoft.com/en-us/window ... ion-portal

Re: Zip/Unzip

Verfasst: Do, 01. Jul 2021 13:52
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

Re: Zip/Unzip

Verfasst: Do, 01. Jul 2021 14:28
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

Re: Zip/Unzip

Verfasst: Do, 01. Jul 2021 14:34
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

Re: Zip/Unzip

Verfasst: Do, 01. Jul 2021 14:35
von Jan
Jupp, klappt.

Jan

Re: Zip/Unzip

Verfasst: Do, 01. Jul 2021 18:07
von Muecke
Hallo Jan

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

Schöne Grüsse
Thomas

Re: Zip/Unzip

Verfasst: Do, 01. Jul 2021 19:17
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

Re: Zip/Unzip

Verfasst: Do, 01. Jul 2021 19:30
von Muecke
Hallo Jan

Ja .

Schöne Grüsse
Thomas

Re: Zip/Unzip

Verfasst: Do, 01. Jul 2021 21:12
von Dominik Krebs
Sehr interessant,
Ich klemme mich mal mit hier dran :)

Re: Zip/Unzip

Verfasst: Do, 01. Jul 2021 21:35
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

Re: Zip/Unzip

Verfasst: Do, 01. Jul 2021 21:59
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 ...

Re: Zip/Unzip

Verfasst: Fr, 02. Jul 2021 7:49
von Marcus Herz
Stimmt Jimmy
Ich hab das glaub ich von dir. Will mich nicht mit fremden Federn schmücken

Re: Zip/Unzip

Verfasst: Fr, 02. Jul 2021 9:54
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

Re: Zip/Unzip

Verfasst: Fr, 02. Jul 2021 11:58
von Muecke
Hallo Jimmy

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

Gruss
Thomas

Re: Zip/Unzip

Verfasst: Fr, 02. Jul 2021 12:56
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.

Re: Zip/Unzip

Verfasst: Fr, 02. Jul 2021 23:24
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.

Re: Zip/Unzip

Verfasst: Fr, 02. Jul 2021 23:45
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

Re: Zip/Unzip

Verfasst: Sa, 03. Jul 2021 6:14
von Jan
Otto,

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

Jan

Re: Zip/Unzip

Verfasst: Mo, 05. Jul 2021 12:50
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() ?

Re: Zip/Unzip

Verfasst: Mo, 05. Jul 2021 17:48
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

Re: Zip/Unzip

Verfasst: Mo, 05. Jul 2021 20:26
von Dominik Krebs
Hallo Jimmy,
Hast du denn zufällig ein Beispiel um auf ein mobil Gerät zuzugreifen?
Das finde ich überaus interessant 😬

Re: Zip/Unzip

Verfasst: Di, 06. Jul 2021 6:51
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) 8028 mal betrachtet
den ganze HMG Source und 32 / 64 Bit EXE findet man hier
https://github.com/AugeOhr/HBFM

Re: Zip/Unzip

Verfasst: Di, 06. Jul 2021 21:23
von Dominik Krebs
Das ist wirklich klasse, jetzt habe ich viel zum experimentieren 😁
Vielen Dank!