Bzip2 Functions

Table of Contents

  • bzclose — Close a bzip2 file
  • bzcompress — Compress a string into bzip2 encoded data
  • bzdecompress — Decompresses bzip2 encoded data
  • bzerrno — Returns a bzip2 error number
  • bzerror — Returns the bzip2 error number and error string in an array
  • bzerrstr — Returns a bzip2 error string
  • bzflush — Force a write of all buffered data
  • bzopen — Opens a bzip2 compressed file
  • bzread — Binary safe bzip2 file read
  • bzwrite — Binary safe bzip2 file write

Коментарии

<?php
/**
 * @return bool
 * @param string $in
 * @param string $out
 * @desc compressing the file with the bzip2-extension
*/
function bzip2 ($in$out)
{
    if (!
file_exists ($in) || !is_readable ($in))
        return 
false;
    if ((!
file_exists ($out) && !is_writeable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
        return 
false;
   
   
$in_file fopen ($in"rb");
   
$out_file bzopen ($out"wb");
   
    while (!
feof ($in_file)) {
       
$buffer fgets ($in_file4096);
         
bzwrite ($out_file$buffer4096);
    }

   
fclose ($in_file);
   
bzclose ($out_file);
   
    return 
true;
}

/**
 * @return bool
 * @param string $in
 * @param string $out
 * @desc uncompressing the file with the bzip2-extension
*/
function bunzip2 ($in$out)
{
    if (!
file_exists ($in) || !is_readable ($in))
        return 
false;
    if ((!
file_exists ($out) && !is_writeable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
        return 
false;

   
$in_file bzopen ($in"rb");
   
$out_file fopen ($out"wb");

    while (
$buffer bzread ($in_file4096)) {
       
fwrite ($out_file$buffer4096);
    }
 
   
bzclose ($in_file);
   
fclose ($out_file);
   
    return 
true;
}
?>
2004-05-20 14:34:03
http://php5.kiev.ua/manual/ru/ref.bzip2.html
<?php
/*
 * Reading a BZIP2 file can be tricky, and I never seen a complete example of
 * code that account for any possible failure that may happen accessing a file
 * in general, and decoding compressed data in this specific case.
 * The example that follows is my attempt to address this gap.
 * Some things that worth noting are:
 * - Encoding/decoding errors must be detected with bzerrno().
 * - bzopen() may fail returning FALSE if the file cannot be created or read,
 *   but succeeds also if the file is not properly encoded.
 * - bzread() may fail returning FALSE if it fails reading from the source, but
 *   it returns the empty string on end of file and on encoding error.
 * - bzread() may still return corrupted data with no error whatsoever until the
 *   BZIP2 algo encounters the first hash code, so data retrieved cannot be
 *   trusted until the very end of the file has been reached.
 */

// Safety first:
error_reporting(-1);
// On error, set $php_errormsg:
ini_set("track_errors""1");

/**
 * Reads and displays on stdout the content of a BZIP2 compressed file with
 * full error detection.
 * @param string $fn Filename.
 * @return void
 */
function displaysBZIP2File($fn)
{
    echo 
"Reading $fn:\n";
   
$bz = @bzopen($fn"r");
    if( 
$bz === FALSE ){
        echo 
"ERROR: bzopen() failed: $php_errormsg\n";
        return;
    }
   
$errno bzerrno($bz);
    if( 
$errno != ){
       
// May detect "DATA_ERROR_MAGIC" (not a BZIP2 file), or "DATA_ERROR"
        // (BZIP2 decoding error) and maybe others BZIP2 errors too.
       
echo "ERROR: bzopen(): BZIP2 decoding failed: "bzerrstr($bz), "\n";
        @
bzclose($bz);
        return;
    }
    while(! 
feof($bz) ) {
       
$s bzread($bz100);
        if( 
$s === FALSE ){
            echo 
"ERROR: bzread() failed: $php_errormsg\n";
            @
bzclose($bz);
            return;
        }
       
$errno bzerrno($bz);
        if( 
$errno != ){
           
// May detect "DATA_ERROR" (BZIP2 decoding error) and maybe others
            // BZIP2 errors too.
           
echo "ERROR: bzread(): BZIP2 decoding failed: "bzerrstr($bz), "\n";
            @
bzclose($bz);
            return;
        }
        echo 
"read: "var_export($strue), "\n";
    }
    if( ! 
bzclose($bz) ){
        echo 
"ERROR: bzclose() failed: $php_errormsg\n";
    }
}

// Target file:
$fn "test.bz2";

// Test 1: writes and read a good BZIP2 file:
file_put_contents($fnbzcompress("Content of the file."));
displaysBZIP2File($fn); // works ok.

// Test 2: invalid content, not a BZIP2 file:
file_put_contents($fn"This ia plain text file, no compression at all!");
displaysBZIP2File($fn); // ERROR: bzread(): BZIP2 decoding failed: DATA_ERROR_MAGIC

// Test 3: creates a corrupted BZIP2 file:
$plain str_repeat("Quite random string. "1000);
$compressed bzcompress($plain);
$compressed_corrupted $compressed;
$compressed_corrupted[(int)(strlen($compressed)/2)] = 'X'// put random char in middle
file_put_contents($fn$compressed_corrupted);
displaysBZIP2File($fn);
// Only after some Kbytes of garbage, it tells:
// ERROR: bzread(): BZIP2 decoding failed: DATA_ERROR

// Safe coding against headache, ever.
?>
2016-01-01 20:22:12
http://php5.kiev.ua/manual/ru/ref.bzip2.html

    Поддержать сайт на родительском проекте КГБ