Título: Una ayudita con Unzip32.dll
Publicado por: LaN en 3 Marzo 2006, 17:41 pm
Bueno pues mi problema pensaba q era sencillo, pero joer no encuentro solucion y me he vuelto loco 1000 veces! :-( Tengo q extraer los archivos de un zip en una carpeta, perfecto. El problema llega que el zip que tengo que extraer tiene 2 carpetas comprimidas: 1 y 2. Entonces al darle a extraer me mezcla los archivos de la carpeta 1 con los de la 2 y quiero que me mantenga ésos directorios. He usado: Un módulo: Private Type CBChar ch(4096) As Byte End Type
Private Type UNZIPUSERFUNCTION UNZIPPrntFunction As Long UNZIPSndFunction As Long UNZIPReplaceFunction As Long UNZIPPassword As Long UNZIPMessage As Long UNZIPService As Long TotalSizeComp As Long TotalSize As Long CompFactor As Long NumFiles As Long Comment As Integer End Type
Private Type UNZIPOPTIONS ExtractOnlyNewer As Long SpaceToUnderScore As Long PromptToOverwrite As Long fQuiet As Long ncflag As Long ntflag As Long nvflag As Long nUflag As Long nzflag As Long ndflag As Long noflag As Long naflag As Long nZIflag As Long C_flag As Long FPrivilege As Long Zip As String extractdir As String End Type
Private Type ZIPnames s(0 To 99) As String End Type Public Declare Function Wiz_SingleEntryUnzip Lib "dll\Unzip32.dll" (ByVal ifnc As Long, ByRef ifnv As ZIPnames, ByVal xfnc As Long, ByRef xfnv As ZIPnames, dcll As UNZIPOPTIONS, Userf As UNZIPUSERFUNCTION) As Long Public Sub UnZip(Zip As String, extractdir As String) On Error GoTo err_Unzip
Dim Resultado As Long Dim intContadorFicheros As Integer
Dim FuncionesUnZip As UNZIPUSERFUNCTION Dim OpcionesUnZip As UNZIPOPTIONS
Dim NombresFicherosZip As ZIPnames, NombresFicheros2Zip As ZIPnames
NombresFicherosZip.s(0) = vbNullChar NombresFicheros2Zip.s(0) = vbNullChar FuncionesUnZip.UNZIPMessage = 0& FuncionesUnZip.UNZIPPassword = 0& FuncionesUnZip.UNZIPPrntFunction = DevolverDireccionMemoria(AddressOf UNFuncionParaProcesarMensajes) FuncionesUnZip.UNZIPReplaceFunction = DevolverDireccionMemoria(AddressOf UNFuncionReplaceOptions) FuncionesUnZip.UNZIPService = 0& FuncionesUnZip.UNZIPSndFunction = 0& OpcionesUnZip.C_flag = 1 OpcionesUnZip.fQuiet = 2 OpcionesUnZip.noflag = 1 OpcionesUnZip.Zip = Zip OpcionesUnZip.extractdir = extractdir
Resultado = Wiz_SingleEntryUnzip(0, NombresFicherosZip, 0, NombresFicheros2Zip, OpcionesUnZip, FuncionesUnZip)
Exit Sub err_Unzip: MsgBox "Unzip: " + Err.Description, vbExclamation Err.Clear End Sub
Private Function UNFuncionParaProcesarMensajes(ByRef fname As CBChar, ByVal X As Long) As Long On Error GoTo err_UNFuncionParaProcesarMensajes
UNFuncionParaProcesarMensajes = 0
Exit Function err_UNFuncionParaProcesarMensajes: MsgBox "UNFuncionParaProcesarMensajes: " + Err.Description, vbExclamation Err.Clear End Function
Private Function UNFuncionReplaceOptions(ByRef p As CBChar, ByVal L As Long, ByRef m As CBChar, ByRef Name As CBChar) As Integer On Error GoTo err_UNFuncionReplaceOptions
UNFuncionParaProcesarPassword = 0
Exit Function err_UNFuncionReplaceOptions: MsgBox "UNFuncionParaProcesarPassword: " + Err.Description, vbExclamation Err.Clear End Function Public Function DevolverDireccionMemoria(Direccion As Long) As Long On Error GoTo err_DevolverDireccionMemoria
DevolverDireccionMemoria = Direccion
Exit Function err_DevolverDireccionMemoria: MsgBox "DevolverDireccionMemoria: " + Err.Description, vbExclamation Err.Clear End Function
Lo podeis encontrar en elguille... Y la informacion de que es cada cosa aqui:
Tipos necesarios:
· Public Type UNZIPUSERFUNCTION
UNZIPPrntFunction As Long
UNZIPSndFunction As Long
UNZIPReplaceFunction As Long
UNZIPPassword As Long
UNZIPMessage As Long
UNZIPService As Long
TotalSizeComp As Long
TotalSize As Long
CompFactor As Long
NumFiles As Long
Comment As Integer
End Type
· Public Type UNZIPOPTIONS
ExtractOnlyNewer As Long
SpaceToUnderScore As Long
PromptToOverwrite As Long
fQuiet As Long
ncflag As Long
ntflag As Long
nvflag As Long
nUflag As Long
nzflag As Long
ndflag As Long
noflag As Long
naflag As Long
nZIflag As Long
C_flag As Long
FPrivilege As Long
Zip As String
ExtractDir As String
End Type
· Public Type ZIPnames
s(0 To 99) As String
End Type
· Public Type CBChar
ch(4096) As Byte
End Type
Declaración de funciones:
· Public Declare Function Wiz_SingleEntryUnzip Lib "unzip32.dll" (ByVal ifnc As Long, ByRef ifnv As ZIPnames, ByVal xfnc As Long, ByRef xfnv As ZIPnames, dcll As DCLIST, Userf As USERFUNCTION) As Long
Retornan 1 si ha ido correctamente y un codigo de error en caso contrario.
Parametros:
Ifnc: Siempre 0
Ifnv: La ruta completa de los ficheros a descomprimir (solo cuando son mas de uno), si no se manda el elmento 0 del array con caracter de fin de cadena.
Xfnc: Siempre 0
Xfnv: La ruta donde se dejara cada uno de los ficheros descomprimido (solo cuando son mas de uno), si no se manda el elemento 0 del array con caracter de fin de cadena.
dcll: Opciones de descompresion
Userf: Direccion de memoria de las funciones a las que la Dll llamara durante la descompresion. Si no nos interesa mandamos: &0.
· La Estructura UNZIPUSERFUNCTION:
Son las funciones a las que la dll lamará cuando quiera hacer determinadas acciones como mostrar mensajes, pedir password, etc
- UNZipPrntFunction: Debe contener la dirección de memoria donde se encuentra la función a la que la dll llamará cuando vaya a mostrar un mensaje.
Esta función, rebirá como parametros un tipo cbchar (array de caracteres que componen el mensaje de la dll) por referencia, y un long, por valor, que indica el tamaño de la cadena recibida.
- UNZipPasswordFunction: Sirve para pedir un password al usuario en caso de que el Zip esté protegido
- UNZipService: Pues la verdad es que no se para que sirve
- UNZipReplaceOption: Para preguntar si queremos o no que se sobreescriban los ficheros.
Si no vamos a utilizar alguna de estas funciones, podemos introducir como valor &0 ( Excepto UzipReplaceOption y UNZipPrntFunction que siempre deben contener una dirección válida)
- TotalSizeComp: Retorna el tamaño en bytes del fichero zip.
- TotalSize: Retorna el tamaño en bytes de todos los archivos que componen el fichero zip una vez descomprimidos.
- CompFactor: Retorna el factor de compresión del fichero zip.
- NumFiles: Retorna el número de archivos que componen el fichero zip.
- Comment: Flag que indica si el fichero zip tiene algún comentario.
· La estructura UNZIPOPTIONS:
Son las distintas opciones que queremos que se apliquen a la hora de construir el fichero Zip.
Las más importantes son:
- PromptToOverwrite: Preguntará al usuario si desea sobreescribir el archivo.
- fQuiet: El nivel de mensajes que emitirá (0 = Todos, 1 = Pocos, 2 = Ninguno)
- fVolume: Si deseamos que incluya la etiqueta de volumen
- nvflag: Si es cero extrae los archivos, si es 1 sólo genera una lista con el
nombre de los archivos comprimidos
- C_flag: Si es sensible a mayúsculas (1 insensible, 0 sensible)
- Zip: El nombre del archivo a descomprimir
- ExtractDir: El directorio donde se descomprimira (Null indica que será en donde se encuentra)
Existen bastantes más parametros.
· La estructura ZIPNames: Contiene los nombres (rutas completas) de los archivos a descomprimir. Y en el form un modulo con lo dicho y un command con: ruta = "c:\prueba" UnZip archivo.zip,ruta Pues eso, me lo extrae bien, pero me mezcla lo que hay en las carpetas comprimidas 1 y 2, dejando todo en c:\prueba. Creo que los tiros andan por: · La estructura ZIPNames: Contiene los nombres (rutas completas) de los archivos a descomprimir. ¿Sera ésta la clave? Pero no se como utilizarlo :-( GACIAS POR LEER HASTA AQUÍ jejeje. Cualquier sugerencia/solución es bienvenida! Salu2!
Título: Re: Una ayudita con Unzip32.dll
Publicado por: LaN en 3 Marzo 2006, 17:55 pm
Mirar casi seguro que es por aqui: Dim NombresFicherosZip As ZIPnames, NombresFicheros2Zip As ZIPnames NombresFicherosZip.s(0) = vbNullChar NombresFicheros2Zip.s(0) = vbNullChar ...etc... Resultado = Wiz_SingleEntryUnzip(0, NombresFicherosZip, 0, NombresFicheros2Zip, OpcionesUnZip, FuncionesUnZip)
Falta decirle que guarde las rutas de éstos archivos...hmmz, salu2!
|