Como se que muchos de ustedes posiblemente han estado buscando rutinas para empacar y desempacar archivos .zip de manera automática y sin instalar librerías de terceros (winzip, .dlls, etc) aquí les envío una copia del .prg que cree para hacer esto sin necesidad de instalar nada mas que VFP.
********************************************
*
* CREADO: Moby
* Guatemala
* Enero 2008
*
* Crear un zip con las funciones del sistema operativo Windows
* Este programa deberia funcionar en windows 95/98/Me/XP/2000/2003/Vista
* Lo he probado en Windows Me/XP/y demas y funciona bien.
*
* Para usarlo en Windows Pre-XP instale primero la funcionalidad
* "carpetas comprimidas"
* en Inicio > Panel de control > Agregar y quitar programas > Componentes Windows
*
* Lo que hay que entender en este programa
* es que para Windows, un archivo .zip no es mas
* que un objeto Folder (es decir una carpeta cualquiera)
*
* Si quieren saber mas sobre Shell.Application
* pueden buscar la documentacion completa en:
*
* +MSDN - Library 2001 o posterior
* ++Platform SDK Documentation
* +++User interface services
* ++++Windows shell
*
* La informacion especifica de como tratar un objeto folter
* la pueden encontrar en:
*
* +MSDN - Library 2001 o posterior
* ++Platform SDK Documentation
* +++User interface services
* ++++Windows shell
* +++++Shell Reference
*
* y denle una ojeada a:
*
* +++Shell Objects for scripting an Visual Basic
* ++++Shell Object
* +++++Methods
* ++++++NameSpace
*
* Y Tambien a:
*
* ++Shell Objects for scripting an Visual Basic
* +++Folder Object
* ++++Methods
* +++++CopyHere
* ++++++Items
*
* El argumento de CopyHere
* PUEDE ser:
*
* Una cadena conteniendo la ruta completa y el nombre del archivo a copiar
* o Una referencia al Objeto FolderItems
* o Una referencia al objeto FolderItem
*
* FolderItems referencia el contenido completo del folder
* folderItem referencia solo un archivo en el folder
*
********************************************
&& Secuencia para empacar un archivo:
&& obtener el nombre del zip
cArchivoZip = GetFile("zip:zip","archivo:","Crear",0)
&& obtener un nombre de directorio para empacar
cDirectorioFuente = GetDir("","FUENTE","¿Que empacar?",80)
&& Si se tiene un nombre de archivo
If .not. (Empty(cArchivoZip) .or. Empty(cDirectorioFuente))
&& Borra el archivo si ya existe y lo envia a la papelera
If File(cArchivoZip)
Delete File (cArchivoZip) RECYCLE
EndIf
&& Crear el nuevo zip
If CreaZip(cArchivoZip)
&& empacalo
Empaca(cArchivoZip,cDirectorioFuente)
EndIf
EndIf
&& Secuencia para desempacar un archivo
&& obtener el nombre del zip
cArchivoZip = GetFile("zip:zip","Archivo:","Desempacalo",0)
&& obtener un nombre de directorio destino
cDirectorioDestino = GetDir("","DESTINO","¿A donde desempacar?",80)
&& Desempacalo
If File(cArchivoZip) .and. !Empty(cDirectorioDestino)
Desempaca(cArchivoZip,cDirectorioDestino)
EndIf
***********************************************************************************
PROCEDURE CreaZip
PARAMETERS cNombre && recibe como parametro el nombre del zip
PRIVATE lRetorno
lRetorno = .f.
&& Crea un archivo zip y le adiciona el primer encabezado
&& Crear el archivo en blanco
nHandle = fCreate(cNombre)
&& si se pudo crear
If nHandle > 0
&& Escribirle el encabezado .zip
nEscritos = fWrite(nHandle,"PK"+Chr(5)+Chr(6)+Replicate(Chr(0),18),22)
&& cerrar el archivo
=fClose(nHandle)
&& reportar OK.
lRetorno = .t.
EndIf
&& para determinar el encabezado se creo un archivo .zip
&& vacio (click derecho > nuevo > carpeta comprimida en zip).
&& Y despues se leyo con la funcion leezip que aparece al final
&& de este prg
RETURN lRetorno
***********************************************************************************
PROCEDURE Empaca
PARAMETERS cFileName,cDirectorio
PRIVATE oShell,oFolder
&& Crear un shell
oShell = CREATEOBJECT("Shell.Application")
&& obtener el objeto Folder del archivo zip
oFolder = oShell.NameSpace(cFileName)
If IsNull(oFolder)
=MessageBox("No se puede abrir el zip.",48,"Advertencia:")
Else
&& si se pudo obtener el objeto folder
&& copiar el directorio al zip
oFolder.CopyHere(cDirectorio)
&& la sintaxis: oShell.NameSpace(cFileName).CopyHere(cDirectorio)
&& es valida.
&& pero Microsoft sugiere primero hacer oFolder = NameSpace
&& y despues usar oFolder.
&& se puede verificar si el zip empaco todo
&& usando la propiedad Count del objeto Items
&& pero les queda de tarea
EndIf
&& se liberan los recursos
Release oShell,oFolder
ENDPROC
***********************************************************************************
PROCEDURE Desempaca
PARAMETERS cFileName,cDirectorio
PRIVATE oShell,;
oFS,; && oFolderSource
oFD,; && oFolderDest
oFSI && oFolderItems
&& Se crea un shell
oShell = CREATEOBJECT("Shell.Application")
&& Se obtiene el objeto folder del zip
oFS = oShell.NameSpace(cFilename)
&& Se obtien el objeto folder del directorio destino
oFD = oShell.NameSpace(cDirectorio)
&& Se obtiene el objeto items del zip
oFSI = oFS.Items
If IsNull(oFS) .or. IsNull(oFD)
=MessageBox("No se puede abrir el zip.",48,"Advertencia:")
Else
&& Si se pudieron obtener todos los objetos
&& Verifica si el zip contiene archivos dentro
If oFSI.Count > 0
&& Metodo para desempacar de uno en uno
&& si necesita usarlo comente el otro metodo y des-comente este
&& note que J empieza en 0 y no en 1
* For J = 0 To (oFSI.Count-1)
* oFD.CopyHere(oFSI.Item(J))
* Next
&& Metodo para desempacar todo de una sola vez
oFD.CopyHere(oFSI)
Else
=MessageBox("El zip de origen esta vacio.",48,"Advertencia")
EndIf
EndIf
&& libera los recursos
Release oShell,oFS,oFD,oFSI
ENDPROC
***********************************************************************************
PROCEDURE LeeZip
PARAMETERS cArchivo
PRIVATE I,J,k
&& abre un archivo (cualquiera) y lo lee byte por byte
&& limpia la pantalla
clear
&& abre el archivo a bajo nivel (read-write unbuffered = 12)
nHandle = fOpen(cArchivo,12)
&& si lo pudo abrir
If nHandle > 0
&& obtiene el tamaño del archivo
j=fseek(nHandle,0,2)
&& ubica el puntero en el inicio
=fSeek(nHandle,0,0)
&& lee el archivo byte por byte
&& y despliega los resultados en pantalla
For i=1 to j
k=fRead(nHandle,1)
? k
?? " = "
?? Asc(k)
EndFor
&& cierra el archivo
=fClose(nHandle)
EndIf
ENDPROC
***********************************************************************************
Gabriel [Moby]
No hay comentarios. :
Publicar un comentario
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.