⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compfile.c

📁 ocx 代码
💻 C
字号:
// CompFile.c: compresses a file

#include <stdio.h>
#include <io.h>

#include "zlib.h"

#define BUF_SIZE	1024

z_stream ZStream;
Bytef *BufIn, *BufOut;
int err;
FILE *fin, *fout;
long length;

/*******************************************************/
int LoadInput()
{
#if defined( _WINDOWS )
    MSG msg;
    while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
#endif
    if ( ZStream.avail_in == 0 ) {
        ZStream.next_in = BufIn;
        ZStream.avail_in = fread( BufIn, 1, BUF_SIZE, fin );
    }
    return ZStream.avail_in;
}


/*******************************************************/
int FlushOutput()
{
unsigned int count;
/*#if defined( _WINDOWS )*/
    MSG msg;
    
	while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
/*#endif*/
    count = BUF_SIZE - ZStream.avail_out;
    if ( count ) {
        if ( fwrite( BufOut, 1, count, fout ) != count ) {
            err = Z_ERRNO;
            return 0;
        }
        ZStream.next_out = BufOut;
        ZStream.avail_out = BUF_SIZE;
    }
    return count;
}



/*******************************************************/
int PerCent()
/* returns an integer between 0 and 100 */
{
    if ( length == 0 )
        return 100;
    else if ( length > 10000000L )
        return ( ZStream.total_in / ( length / 100 ) );
    else
        return ( ZStream.total_in * 100 / length );
}



/*******************************************************/
int EXPORT CompFile (char *OutputName, 
					 char *InputName, 
					 int Level, 
					 long (CALLBACK *lpPercCallback)( long Perc ) )
{
	/* previous percent value: used to avoid calling two or more times 
	   the callback function with the same percent value */
	int OldPerc;
	int NewPerc;

	/* opens files */
    fin  = fopen( InputName, "rb" );
    if( fin == NULL ) return -200;
    fout = fopen( OutputName, "wb" );
    if( fout == NULL ) return -201;

	length = filelength( fileno( fin ) );

	/* allocates buffers */
	BufIn = (Bytef*) malloc( BUF_SIZE );
	if( BufIn == NULL ) {
		fclose( fin );
		fclose( fout );
		return Z_MEM_ERROR;
	}

	BufOut = (Bytef*) malloc( BUF_SIZE );
	if( BufIn == NULL ) {
		fclose( fin );
		fclose( fout );
		free( BufIn );
		return Z_MEM_ERROR;
	}

	ZStream.zalloc = 0;  //z_stream member
    ZStream.zfree = 0;   //z_stream member
    ZStream.opaque = 0;  //z_stream member

    err = Z_OK;
    ZStream.avail_in = 0;
    ZStream.avail_out = BUF_SIZE;
    ZStream.next_out = BufOut;

	OldPerc = -1;
    
	err = deflateInit(&ZStream, Level);
    if (err != Z_OK) return err;

    for ( ; ; ) {
/*        if ( m_AbortFlag )
            break;*/
        if ( !LoadInput() )
            break;
        err = deflate( &ZStream, Z_NO_FLUSH );
        FlushOutput();
        if ( err != Z_OK )
            break;
        /*progress( percent() );*/
		NewPerc = PerCent();
		if( lpPercCallback != NULL && NewPerc != OldPerc ) {
			(*lpPercCallback)( NewPerc );
			OldPerc = NewPerc;
		}
    }
    for ( ; ; ) {
/*        if ( m_AbortFlag )
            break;*/
        err = deflate( &ZStream, Z_FINISH );
        if ( !FlushOutput() )
            break;
        if ( err != Z_OK )
            break;
    }

/*    progress( percent() );*/
		NewPerc = PerCent();
		if( lpPercCallback != NULL && NewPerc != OldPerc ) {
			(*lpPercCallback)( NewPerc );
			OldPerc = NewPerc;
		}
    deflateEnd( &ZStream );
/*    if ( m_AbortFlag )
        status( "User Abort" );
    else if ( err != Z_OK && err != Z_STREAM_END )
        status( "Zlib Error" );
    else {
        status( "Success" );
        err = Z_OK;
    }*/

	if( err = Z_STREAM_END ) err = Z_OK;

    fclose( fin );
    fclose( fout );

	free( BufIn );
	free( BufOut );

	return err;
}



/*******************************************************/
int EXPORT DecompFile (char *OutputName, 
					   char *InputName, 
					   long (CALLBACK *lpPercCallback)( long Perc ) )
{
	/* previous percent value: used to avoid calling two or more times 
	   the callback function with the same percent value */
	int OldPerc;
	int NewPerc;

	/* opens files */
    fin  = fopen( InputName, "rb" );
    if( fin == NULL ) return -200;
    fout = fopen( OutputName, "wb" );
    if( fout == NULL ) return -201;

	length = filelength( fileno( fin ) );

	/* allocates buffers */
	BufIn = (Bytef*) malloc( BUF_SIZE );
	if( BufIn == NULL ) {
		fclose( fin );
		fclose( fout );
		return Z_MEM_ERROR;
	}

	BufOut = (Bytef*) malloc( BUF_SIZE );
	if( BufIn == NULL ) {
		fclose( fin );
		fclose( fout );
		free( BufIn );
		return Z_MEM_ERROR;
	}

    ZStream.zalloc = 0;  //z_stream member
    ZStream.zfree = 0;   //z_stream member
    ZStream.opaque = 0;  //z_stream member

    err = Z_OK;
    ZStream.avail_in = 0;
    ZStream.avail_out = BUF_SIZE;
    ZStream.next_out = BufOut;

	OldPerc = -1;

    err = inflateInit(&ZStream);
    if (err != Z_OK) return err;

    for ( ; ; ) {
/*        if ( m_AbortFlag )
            break;*/
        if ( !LoadInput() )
            break;
        err = inflate( &ZStream, Z_NO_FLUSH );
        FlushOutput();
        if ( err != Z_OK )
            break;
        /*progress( percent() );*/
		NewPerc = PerCent();
		if( lpPercCallback != NULL && NewPerc != OldPerc ) {
			(*lpPercCallback)( NewPerc );
			OldPerc = NewPerc;
		}
    }
    for ( ; ; ) {
/*        if ( m_AbortFlag )
            break;*/
        err = inflate( &ZStream, Z_FINISH );
        if ( !FlushOutput() )
            break;
        if ( err != Z_OK )
            break;
    }

/*    progress( percent() );*/
		NewPerc = PerCent();
		if( lpPercCallback != NULL && NewPerc != OldPerc ) {
			(*lpPercCallback)( NewPerc );
			OldPerc = NewPerc;
		}
    inflateEnd( &ZStream );
/*    if ( m_AbortFlag )
        status( "User Abort" );
    else if ( err != Z_OK && err != Z_STREAM_END )
        status( "Zlib Error" );
    else {
        status( "Success" );
        err = Z_OK;
    }*/

	if( err = Z_STREAM_END ) err = Z_OK;

    fclose( fin );
    fclose( fout );

	free( BufIn );
	free( BufOut );

	return err;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -