Os dejo dos funciones para la compresión y descompresión de ficheros en la PDA.
Estas dos funciones utilizan la librería zlibce (http://www.zlib.net) que es de libre uso y distribución (mirad la licencia).
Para compilar las funciones necesitais añadir a vuestro proyecto la librería zlibce.lib. Además debeis tener accesible en vuestro 'path include' el fichero #include "zlib.h"
Para utilizar estas funciones en vuestra aplicación necesitais copiar el fichero zlibce.dll o bien en la carpeta de la aplicación o bien en la carpeta de windows de la PDA.
Aquí: http://www.tenik.co.jp/~adachi/wince/zlibce/index.html podeis bajaros todo lo necesario (es la tercera opción).
Saludos,
José Luis Capel
Code: Select all
function Main()
LOCAL a
IF !Comprime(CurDir()+"\module1.prg",CurDir()+"\pepe.zip")
MsgInfo("Error en compresión")
ENDIF
IF !DesComprime(CurDir()+"\pepe.zip",CurDir()+"\modulo2.prg")
MsgInfo("Error en descompresión")
ENDIF
RETURN NIL
#pragma BEGINDUMP
#include <hbapi.h>
#include <windows.h>
#include <stdio.h>
#include <fcntl.h>
#include <assert.h>
#include "zlib.h"
#define CHUNK 16384
int AicomComprime(FILE *source, FILE *dest, int level);
int AicomDescomprime(FILE *source, FILE *dest);
HB_FUNC( COMPRIME )
{
int nResult;
char * sOrigen;
char * sDestino;
FILE * fOrigen;
FILE * fDestino;
sOrigen = hb_parc(1);
sDestino = hb_parc(2);
// Abrimos fichero origen
if ( (fOrigen = fopen( sOrigen, "r+b" )) == NULL )
{
hb_retl(FALSE);
return;
}
// Abrimos fichero destino
if ( (fDestino = fopen( sDestino, "w+b" )) == NULL )
{
fclose(fOrigen);
hb_retl(FALSE);
return;
}
nResult = AicomComprime( fOrigen, fDestino, 1 );
switch( nResult )
{
case Z_MEM_ERROR:
hb_retl(FALSE);
MessageBox(NULL,L"Error Memoria",L"Zlib",MB_OK);
break;
case Z_STREAM_ERROR:
hb_retl(FALSE);
MessageBox(NULL,L"Error Stream",L"Zlib",MB_OK);
break;
case Z_VERSION_ERROR:
hb_retl(FALSE);
MessageBox(NULL,L"Error Version",L"Zlib",MB_OK);
break;
case Z_ERRNO:
hb_retl(FALSE);
MessageBox(NULL,L"Error R/W",L"Zlib",MB_OK);
break;
}
fclose(fOrigen);
fclose(fDestino);
hb_retl(TRUE);
}
HB_FUNC( DESCOMPRIME )
{
int nResult;
char * sOrigen;
char * sDestino;
FILE * fOrigen;
FILE * fDestino;
sOrigen = hb_parc(1);
sDestino = hb_parc(2);
// Abrimos fichero origen
if ( (fOrigen = fopen( sOrigen, "r+b" )) == NULL )
{
hb_retl(FALSE);
return;
}
// Abrimos fichero destino
if ( (fDestino = fopen( sDestino, "w+b" )) == NULL )
{
fclose(fOrigen);
hb_retl(FALSE);
return;
}
nResult = AicomDescomprime( fOrigen, fDestino );
switch( nResult )
{
case Z_MEM_ERROR:
MessageBox(NULL,L"Error Memoria",L"Zlib",MB_OK);
hb_retl(FALSE);
break;
case Z_STREAM_ERROR:
MessageBox(NULL,L"Error Stream",L"Zlib",MB_OK);
hb_retl(FALSE);
break;
case Z_VERSION_ERROR:
MessageBox(NULL,L"Error Version",L"Zlib",MB_OK);
hb_retl(FALSE);
break;
case Z_ERRNO:
hb_retl(FALSE);
MessageBox(NULL,L"Error R/W",L"Zlib",MB_OK);
break;
}
fclose(fOrigen);
fclose(fDestino);
hb_retl(TRUE);
}
int AicomComprime(FILE *source, FILE *dest, int level)
{
int ret, flush;
unsigned have;
z_stream strm;
unsigned char in[CHUNK];
unsigned char out[CHUNK];
TCHAR szError[512];
/* allocate deflate state */
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
ret = deflateInit(&strm, level);
if (ret != Z_OK)
return ret;
/* compress until end of file */
do {
strm.avail_in = fread(in, sizeof(unsigned char), CHUNK, source);
if (ferror(source)) {
(void)deflateEnd(&strm);
return Z_ERRNO;
}
flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
strm.next_in = in;
/* run deflate() on input until output buffer not full, finish
compression if all of source has been read in */
do {
strm.avail_out = CHUNK;
strm.next_out = out;
ret = deflate(&strm, flush); /* no bad return value */
assert(ret != Z_STREAM_ERROR); /* state not clobbered */
have = CHUNK - strm.avail_out;
if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
(void)deflateEnd(&strm);
return Z_ERRNO;
}
} while (strm.avail_out == 0);
assert(strm.avail_in == 0); /* all input will be used */
/* done when last data in file processed */
} while (flush != Z_FINISH);
assert(ret == Z_STREAM_END); /* stream will be complete */
/* clean up and return */
(void)deflateEnd(&strm);
return Z_OK;
}
int AicomDescomprime(FILE *source, FILE *dest)
{
int ret;
unsigned have;
z_stream strm;
unsigned char in[CHUNK];
unsigned char out[CHUNK];
/* allocate inflate state */
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.avail_in = 0;
strm.next_in = Z_NULL;
ret = inflateInit(&strm);
if (ret != Z_OK)
return ret;
/* decompress until deflate stream ends or end of file */
do {
strm.avail_in = fread(in, 1, CHUNK, source);
if (ferror(source)) {
(void)inflateEnd(&strm);
return Z_ERRNO;
}
if (strm.avail_in == 0)
break;
strm.next_in = in;
/* run inflate() on input until output buffer not full */
do {
strm.avail_out = CHUNK;
strm.next_out = out;
ret = inflate(&strm, Z_NO_FLUSH);
assert(ret != Z_STREAM_ERROR); /* state not clobbered */
switch (ret) {
case Z_NEED_DICT:
ret = Z_DATA_ERROR; /* and fall through */
case Z_DATA_ERROR:
case Z_MEM_ERROR:
(void)inflateEnd(&strm);
return ret;
}
have = CHUNK - strm.avail_out;
if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
(void)inflateEnd(&strm);
return Z_ERRNO;
}
} while (strm.avail_out == 0);
/* done when inflate() says it's done */
} while (ret != Z_STREAM_END);
/* clean up and return */
(void)inflateEnd(&strm);
return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
}
#pragma ENDDUMP