¿Como se puede hacer un Unzip automatizado?

358 views
Skip to first unread message

Jorge Alomar

unread,
Sep 4, 2020, 7:37:28 AM9/4/20
to Comunidad de Visual Foxpro en Español
  Buenos días colegas, estoy trabado con este tema, recibo de un apirest un string para crear un zip, dentro de este zip está la respuesta en un archivo json. 
  Creo el archivo zip, con un strtofile(), pero necesito lograr descomprimirlo con automatización para poder leer el json y seguir con el proceso. 

  Hace mucho tiempo usaba el pkzip/pkunzip pero ya no es soportado por windows 10 64bits.
  ¿Hay alguna manera de hacerlo mediante automatización?   

Edwin Duran

unread,
Sep 4, 2020, 7:47:22 AM9/4/20
to Comunidad de Visual Foxpro en Español

Marlon Sotomayor

unread,
Sep 4, 2020, 8:22:54 AM9/4/20
to Comunidad de Visual Foxpro en Español
Hola,

Recibes el archivo
desti=ALLTRIM(GETFILE('ZIP'))

Crear carpeta con el mismo nombre del archivo (sin .zip)
destino = SUBSTR(desti,1,LEN(desti)-4)
RMDIR "&destino"

debes tener una clase llamada zip.vcx (si no la tienes puedo compartir)
SET CLASSLIB TO 'zip.vcx' ADDITIVE 
oZip=CREATEOBJECT('Zip.Zip')

WITH oZip
.ArchivoZip='&desti'
.DirectorioDestino='&destino'
?'Descomprimiendo archivo ZIP'
? .Descomprimir()
ENDWITH

adicional debes contener 2 archivos:
azip32.dll (para comprimir)
aunzip32.dll (para descomprimir)

una ves que ejecuta el proceso el/los archivos se descomprimen con el mismo nombres del archivo original

Saludos

Fernando Mora

unread,
Sep 4, 2020, 9:17:54 AM9/4/20
to Comunidad de Visual Foxpro en Español
Use Shell y no se complique la vida. 

*-- Cargo mi Zip de origen
tcZipName='c:\MiArchivoComprimido.zip'
oShell = CreateObject("Shell.Application")
oZip = oShell.NameSpace(tcZipName)
oItem = oZip.Items()

*-- Mi Carpeta destino
tcFolDest = 'c:\MiCarpetaDestino\'
oDestino = oShell.NameSpace(tcFolDest)
for i = 1 to oItem.Count
oDestino.CopyHere(oItem.Items(i))
Next 

Fernando Mora

unread,
Sep 4, 2020, 9:27:24 AM9/4/20
to Comunidad de Visual Foxpro en Español
Dentro del bucle For falta un proceso que es extraer el objeto "archivo" asi:

oFile = oItem.Item(i)
oFolder.CopyHere(oFile.Path)

Jorge Alomar

unread,
Sep 4, 2020, 11:11:00 AM9/4/20
to Comunidad de Visual Foxpro en Español
  Gracias a todos por la pronta respuesta.
  Fernando probé el código que me enviaste pero no reconoce el archivo que hay en el interior del zip y la colección oItem queda vacía.
  Marlon que iría dentro del método Descomprimir ?  
  

Fernando Mora

unread,
Sep 4, 2020, 11:45:53 AM9/4/20
to Comunidad de Visual Foxpro en Español
Jorge, ten en cuenta que estos objeto cuentan desde el elemento 0, revisa si no es eso, porque yo uso Shell en Windows 10 64bits, deje de usar las Dll de UnZip y Zip porque me dieron problema en un caso con un cliente, ya ni recuerdo como era la cosas, pero por eso me pasea usar shell.

Aquí te paso el procedure de la clase que uso, que comprime y descomprime con Shell.

*-- Procedure UnZip
Lparameters tcFileZip As String, tcFolDestino As String
Local loShell, loZip, loItems, loFile, loDestino, nItem
*-- Cargamos el archivo comprmido
loShell = CreateObject("Shell.Application")
loZip   = loShell.NameSpace(tcFileZip)
loItems = loZip.Items()
*-- Cargamos la carpeta de destino y descomprimimos
loDestino = loShell.NameSpace(tcFolDestino)
for nItem = 0 to loItems.Count-1
loFile = loItems.Item(nItem)
loDestino.CopyHere(loFile.Path)
Next

Marlon Sotomayor

unread,
Sep 5, 2020, 5:07:28 PM9/5/20
to Comunidad de Visual Foxpro en Español
archivo='marlon.zip' && marlon.zip archivo a descomprimir

&& clase (zip.vcx)                && Dll   ( aunzip32.dll  )
SET CLASSLIB TO 'zip.vcx' ADDITIVE 
oZip=CREATEOBJECT('Zip.Zip')

WITH oZip
.ArchivoZip='&archivo'
.DirectorioDestino='UNO' && Crea una carpeta UNO
? .Descomprimir() && Descomprime todos los archivos
ENDWITH
=MESSAGEBOX('Proceso completo')


Resumen:
archivo a descomprimir marlon.zip
luego del proceso todos los archivos estan bajo la carpeta UNO
Debes tener 3 archivos necesarios para ello:
zip.VCT
aunzip32.dll
azip32.dll
Message has been deleted

jame...@gmail.com

unread,
Sep 12, 2020, 5:42:49 PM9/12/20
to Comunidad de Visual Foxpro en Español
Te puede servir mi nuevo proyecto. 
La importación al proyecto es muy fácil, está documentado y es muy fácil de usar, y tiene un ejemplo: 


* esto es para cargar la librería
DO (GETENV("userprofile") + "\Kawix\Shide\interop")
local AdmZip
AdmZip = _screen.nodeinterop.loadRemoteLibrary("gh+/FoxShell/admzip/src/admzip.prg|admzip-0.0.1")


zip = AdmZip.get("c:/rutaalarchivo.zip")
* Obtener la lista de archivos del ZIP
entries = zip.getEntries()
* Suponiendo que sea un solo archivo dentro del zip: 
content = zip.read(entries.item[1])
* Content tendrás el contenido del archivo dentro del zip. De esta manera obtienes el contenido sin necesidad de descomprimir todo el zip
?content 

Jorge Alomar

unread,
Sep 15, 2020, 6:36:13 PM9/15/20
to Comunidad de Visual Foxpro en Español
  Gracias James, me colgué y no puse la solución. Con el ejemplo de Fernando no me leía el contenido del zip, sin embargo probaba con un zip común y si funcionaba ese código. Instalé 7zip y tampoco leía el contenido del zip. Lo único que me habría el zip era winrar, pero sale el cartel de que es una versión shareware.
  Después de mucho probar vi en la info del archivo de winrar que era un zip hecho en Unix.
  Probé de descomprimirlo por línea de comando y no salió la ventana de shareware!!!!!
  Esa fue la solución, comparto el código:

DECLARE INTEGER ShellExecute IN SHELL32.DLL ;
        INTEGER handle,;
        STRING @sFile,;
        STRING @lp,;
        STRING @DIR,;
        STRING @dir1,;
        INTEGER ncmd
        LOCAL lcFile, lcRun
        lcFile = ADDBS(GETENV("TMP"))+"GZipStream"  
        lcRun = 'x '+FORCEEXT(lcFile,"zip")+' '+ADDBS(lcFile)
SHELLEXECUTE(0, "", "winrar",  lcRun, "", 7)



Reply all
Reply to author
Forward
0 new messages