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 (143.17 KiB) 8570 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!