In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

TZip() en Xailer 5

Foro de Xailer profesional en español
Responder
Avatar de Usuario
XeviCOMAS
Mensajes: 593
Registrado: Sab Mar 12, 2011 8:16 pm

TZip() en Xailer 5

Mensaje por XeviCOMAS »

Con el cambio de mis aplicaciones a Xailer5 y retomando el hilo...

https://www.xailer.com/forum/viewtopic. ... 437#p53096

*************************************************************************************
Resulta que lo que busco es hacer una copia de mis ficheros que estan en una carpeta
CarpetaA
FicheroA01
FicheroA02
CarpetaB1
FicheroB1
FicheroB2

El caso...
WITH OBJECT oZip := TZipFile():New()
:lRecurse := .T.

Guarda TODOS los archivos correctamente, PERO me pone el path completo de la ubicación de los archivos.
Así pues esta copia por ejemplo la guardaria en
CarpetaPrueba+CarpetaOtra+CarpetaA...
Lo que necesito es que guarde la ubicación, SI pero SOLO A PARTIR DE DESDE ESTOY HACIENDO LA COPIA. Vaya, como hace Winzip o cualquier compresor de archivos.
Lo que seria en la CarpetaA

(lIncludePath por defecto esta en .T.)
Si lIncludePath lo establezco a .f., los ficheros se guardan, pero sin carpetas contenedoras.


Para este menester, dispongo de un ZipArchive del 10/12/2012 que me está funcionando, PERO estaria correcto que el mismo Xailer funcionara de esta forma, no???

No se si me explico.
Un Saludo,
Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9447
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: TZip() en Xailer 5

Mensaje por ignacio »

Buenos días,

Te ruego pruebes el ejemplo \samples\Testzip. Entiendo que está funcionando correctamente:
2018-01-08 10_49_31-test.zip - WinRAR.png
2018-01-08 10_49_31-test.zip - WinRAR.png (14.95 KiB) Visto 6806 veces
Saludos
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
XeviCOMAS
Mensajes: 593
Registrado: Sab Mar 12, 2011 8:16 pm

Re: TZip() en Xailer 5

Mensaje por XeviCOMAS »

Pues no... no lo hace correctamente, de ahí mi post.

Usando el Sample ZipArchive...
Selecciono la carpeta a comprimir... Samples ubicada en C:\Xailer.
SOLO QUIERO LA CARPETA "Samples" y sus ficheros i carpetas que contiene.

Selecciono destino del fichero zip, prova.zip ubicada en Escritorio.

Le doy al botón ZIP y se ejecuta el empaquetado de carpeta y archivos.

Bien, el resultado que obtengo es como adjunto en la imagen.
Se guarda la carpeta Xailer, dentro de ella está solo la carpeta Samples y dentro Samples todos los archivos y carpetas que contiene...
CUANDO deberia de guardarse SOLO la carpeta Samples y dentro de ella todos los archivos y carpetas que contiene.

O sea, que guarda la carpeta PARENT de Samples, cuando NO DEBERIA.
Adjuntos
Captura.JPG
Captura.JPG (83.86 KiB) Visto 6801 veces
Un Saludo,
Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9447
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: TZip() en Xailer 5

Mensaje por ignacio »

Buenos días,

Tiene sentido lo que dices. Te ruego pruebes con el fichero adjunto; pero me da muchísimo miedo romper código existente. Os ruego a todos los que uséis está clase y estéis actualizados a la última versión de Xailer o tengáis intención de hacerlo que probéis si vuestros programas funcionan correctamente. Muchas gracias.

En cualquier caso creo que la sugerencia de Xevi es correcta.

Un saludo
Adjuntos
ZipArchive.rar
(4.03 KiB) Descargado 261 veces
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
XeviCOMAS
Mensajes: 593
Registrado: Sab Mar 12, 2011 8:16 pm

Re: TZip() en Xailer 5

Mensaje por XeviCOMAS »

Ignacio,

CASI !!!

Ahora te guarda TODOS los archivos de la carpeta (en este supuesto archivos y carpetas de la carpeta Samples ubicado en C:\Xailer)
PERO los guarda en la raiz del zip... no se guarda en la carpeta Samples.

Lo que falta es "encapsular" los archivos en la carpeta.
O sea, lo que deberia de guardar es los archivos de "Folder to zip:" en el archivo "Zip file to create:" creando una carpeta en el zip del mismo nombre de la Carpeta seleccionada en "Folder to zip:" SOLO el nombre de la Carpeta... dentro TODOS los archivos y carpetas.

Es como funcionaba hasta Xailer2, creo (yo tengo el ZipArchive.prg del 2012 que es el que estoy utilizando para que me haga las copias correctamente) y como es lo que hace si comprimes una carpeta desde el explorador de Windows mismo... te crea un zip, con una carpeta en la que ubica TODOS los archivos y carpetas incluidos en la misma

Supongo que me entiendes,...
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 593
Registrado: Sab Mar 12, 2011 8:16 pm

Re: TZip() en Xailer 5

Mensaje por XeviCOMAS »

Mirando la modificación que has hecho...

IF Empty( nPos )
// IF ( nPos := At( "\", cPath ) ) > 0 // Only one path, the common path will be the drive letter
IF ( nPos := Rat( "\", cPath ) ) > 0 // Only one path, the comman path will be that path
cPath := Left( cPath, nPos )
ENDIF
ELSE
IF ( nPos := RAt( "\", cPath ) ) > 0
cPath := Left( cPath, nPos )
ENDIF
ENDIF
*********************************************

Si Empty( nPos ) o !Empty( nPos )... terminan haciendo lo mismo.
No sirve!!!

Si Empty( nPos )
... deberia de quedarse con el nombre de la Carpeta seleccionada, y añadirla al zip.
Un Saludo,
Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9447
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: TZip() en Xailer 5

Mensaje por ignacio »

Buenas tardes,

Olvídate de mi última subida y simplemente utiliza la propiedad lMaskComPath a .T.

Saludos
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
XeviCOMAS
Mensajes: 593
Registrado: Sab Mar 12, 2011 8:16 pm

Re: TZip() en Xailer 5

Mensaje por XeviCOMAS »

Ignacio,

He quitado el fichero ZipArchive.prg del proyecto del Sample de Xailer.

Lo he puesto así en el Sample de Xailer...

Código: Seleccionar todo

METHOD Button2Click( oSender ) CLASS TForm1

   LOCAL cSrcFile, cTrgFile

   cSrcFile := ::oEdit1:cText + "\*.*"
   cTrgFile := ::oEdit2:cText

   WITH OBJECT TZipFile():Create()
:lMasksComPath := .T.
      :aFileMask := { cSrcFile }
      :cFileName := cTrgFile
      //:cPassword := "test"
      :lRecurse  := .t.
      //:lIncludePath := .f.
      ::oProgressBar1:nValue := 0
      ::oProgressBar1:nMax := :FilesSize()
      ::oButton2:lEnabled := .F.
      :OnProgress := "ProgressZip"
      :OnChangeFile := "ChangeFileZip"
      IF :Run()
         Msginfo( "Zip file " + cTrgFile + " created correctly" )
      ELSE
         MsgAlert( "Zip file " + cTrgFile + " not created correctly" )
      ENDIF
      ::oButton2:lEnabled := .T.
   END WITH

   ::oProgressBar1:nValue := 0

RETURN Nil
Ni a .T. ni a .F.
El resultado final SIEMPRE es el mismo.
la imagen que te he enviado antes de que modificaras la clase.
INCLUYE TODA LA RUTA RELATIVA desde Xailer...
Y solo le doy a guardar la carpeta Samples!!!
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 593
Registrado: Sab Mar 12, 2011 8:16 pm

Re: TZip() en Xailer 5

Mensaje por XeviCOMAS »

Así, pues... imaginemos que quiero guardar en zip la carpeta "Source" que está ubicada en "C:\Xailer\Samples\GlassBtn"

Lo normal que deberia de hacer.
Crear un Zip con una Carpeta "Source" y en ella, TODOS los archivos y carpetas de su interior.

Si???

Pues lo que hace es, Crear un archivo Zip
con una carpeta "Xailer"
que en su interior contiene una carpeta "Samples"
que en su interior contiene una carpeta "GlassBtn"
y ya finalmente SI... que en su interior contiene una carpeta "Source" y en ella, TODOS los archivos y carpetas de su interior.

ABSURDO, no???
Un Saludo,
Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9447
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: TZip() en Xailer 5

Mensaje por ignacio »

No veo en tu código nada respecto a:

Código: Seleccionar todo

lMaskComPath a .T.
No obstante, estoy de acuerdo que incluso con lMasComPath a .F. no debería funcionar como lo hace actualmente. Pero prefiero no tocarlo si no es necesario.

Saludos
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
XeviCOMAS
Mensajes: 593
Registrado: Sab Mar 12, 2011 8:16 pm

Re: TZip() en Xailer 5

Mensaje por XeviCOMAS »

METHOD Button2Click( oSender ) CLASS TForm1

LOCAL cSrcFile, cTrgFile

cSrcFile := ::oEdit1:cText + "\*.*"
cTrgFile := ::oEdit2:cText

WITH OBJECT TZipFile():Create()
:lMasksComPath := .T.
:aFileMask := { cSrcFile }
:cFileName := cTrgFile
//:cPassword := "test"
:lRecurse := .t.
//:lIncludePath := .f.
::oProgressBar1:nValue := 0
::oProgressBar1:nMax := :FilesSize()
::oButton2:lEnabled := .F.
:OnProgress := "ProgressZip"
:OnChangeFile := "ChangeFileZip"
IF :Run()
Msginfo( "Zip file " + cTrgFile + " created correctly" )
ELSE
MsgAlert( "Zip file " + cTrgFile + " not created correctly" )
ENDIF
::oButton2:lEnabled := .T.
END WITH

::oProgressBar1:nValue := 0

RETURN Nil
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 593
Registrado: Sab Mar 12, 2011 8:16 pm

Re: TZip() en Xailer 5

Mensaje por XeviCOMAS »

:lMasksComPath := .T.
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 593
Registrado: Sab Mar 12, 2011 8:16 pm

Re: TZip() en Xailer 5

Mensaje por XeviCOMAS »

Si no lo cambiais en la clase de Xailer... me puedes decir que cambio y así lo modifico en la clase y la incluyo en mis aplicaciones ???

Gracias.
Un Saludo,
Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9447
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: TZip() en Xailer 5

Mensaje por ignacio »

Este código debería funcionar (líneas 299 y siguientes de ZipArchive.prg):

Código: Seleccionar todo

   IF Empty( nPos )
      IF ( nPos := Rat( "\", cPath ) ) > 0   // Quitamos la máscara si la hubiese
        cPath := Left( cPath, nPos - 1 )
         IF ( nPos := Rat( "\", cPath ) ) > 0   // Retrocedemos un directorio
           cPath := Left( cPath, nPos )
         ELSE 
            cPath += "\"
         ENDIF
      ENDIF
   ELSE
       IF ( nPos := RAt( "\", cPath ) ) > 0
         cPath := Left( cPath, nPos )
       ENDIF
   ENDIF
Espero que ahora esté bien.

Saludos
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
XeviCOMAS
Mensajes: 593
Registrado: Sab Mar 12, 2011 8:16 pm

Re: TZip() en Xailer 5

Mensaje por XeviCOMAS »

PERFECTO!!!

El Sample de ZipArchive ya hace lo que deberia, segun mi criterio y como se guardan las copias por ejemplo utilizando el boton derecho encima de una carpeta con el Explorador de archivos... enviar a carpeta comprimida en zip.

Así lo he dejado, por si no se incluye en la clase original de TZipFile() y alguien más lo pudiera necesitar.

Código: Seleccionar todo

METHOD CommonMaskPath() CLASS XZipFile

   LOCAL cPath, cMask
   LOCAL nLen, nPos, nFor

   IF ValType( ::FaFileMask ) == "C"
      ::FaFileMask := { ::FaFileMask }
   ENDIF

   cPath := ::FaFileMask[ 1 ]

   FOR nFor := 2 TO Len( ::FaFileMask )
      cMask := ::FaFileMask[ nFor ]
      nPos  := 1
      nLen  := Min( Len( cPath ), Len( cMask ) )
      DO WHILE nPos <= nLen
         IF Upper( Left( cPath, nPos ) ) == Upper( Left( cMask, nPos ) )
            nPos++
         ELSE
            EXIT
         ENDIF
      ENDDO
      cPath := Left( cPath, nPos - 1 )
      IF Empty( cPath )
         EXIT
      ENDIF
   NEXT

   IF Empty( nPos ) // Only one path, the common path will be the drive letter
//      IF ( nPos := At( "\", cPath ) ) > 0
//        cPath := Left( cPath, nPos )
//      ENDIF
//Cambio Solicitado a Ignacio para NO incluir TODA la ruta relativa de la carpeta/archivos a zipear
      IF ( nPos := Rat( "\", cPath ) ) > 0   // Quitamos la máscara si la hubiese
        cPath := Left( cPath, nPos - 1 )
         IF ( nPos := Rat( "\", cPath ) ) > 0   // Retrocedemos un directorio
           cPath := Left( cPath, nPos )
         ELSE 
            cPath += "\"
         ENDIF
      ENDIF
   ELSE
       IF ( nPos := RAt( "\", cPath ) ) > 0
         cPath := Left( cPath, nPos )
       ENDIF
   ENDIF

RETURN cPath
Gracias.
Un Saludo,
Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9447
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: TZip() en Xailer 5

Mensaje por ignacio »

Xevi,

No te preocupes. Se incluirá en la siguiente actualización a no ser que algún usuario nos muestre un gran perjuicio por el cambio.

Un saludo
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
XeviCOMAS
Mensajes: 593
Registrado: Sab Mar 12, 2011 8:16 pm

Re: TZip() en Xailer 5

Mensaje por XeviCOMAS »

Perfecto!!!

Una cosa a "arreglar" / "cambiar" en la descarga de Xailer... el Sample ZipArchive.

El proyecto incluye el ZipArchive.prg de SourceXailer...

<Files>
<File Filename="TestZip.prg"/>
<File Filename="Form1.prg"/>
<File Filename="..\..\..\source\ZipArchive.prg"/>
</Files>

No deberia, ya que TZipFile() ya es una clase incluida en Xailer... y además, quien se descargue la demo, no le va a compilar!!!
Un Saludo,
Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9447
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: TZip() en Xailer 5

Mensaje por ignacio »

Buenas tardes,

Es un error nuestro. Realmente no es necesario dicho archivo en el proyecto. Esta ahí para poder depurar el código cómodamente. Se quitará en la próxima actualización.

Un saludo
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder