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

📄 pclzip.lib.php

📁 Joomla15 - 最新开源CMS
💻 PHP
📖 第 1 页 / 共 5 页
字号:
<?php
/**
* @version $Id: pclzip.lib.php 7890 2007-07-07 12:52:33Z friesengeist $
* @package		Joomla
*/


// --------------------------------------------------------------------------------
// PhpConcept Library - Zip Module 2.1
// --------------------------------------------------------------------------------
// License GNU/LGPL - Vincent Blavet - December 2003
// http://www.phpconcept.net
// --------------------------------------------------------------------------------
//
// Presentation :
//	PclZip is a PHP library that manage ZIP archives.
//	So far tests show that archives generated by PclZip are readable by
//	WinZip application and other tools.
//
// Description :
//	See readme.txt and http://www.phpconcept.net
//
// Warning :
//	This library and the associated files are non commercial, non professional
//	work.
//	It should not have unexpected results. However if any damage is caused by
//	this software the author can not be responsible.
//	The use of this software is at the risk of the user.
//
// --------------------------------------------------------------------------------
// $Id: pclzip.lib.php 7890 2007-07-07 12:52:33Z friesengeist $
// --------------------------------------------------------------------------------

  // ----- Constants
  define( 'PCLZIP_READ_BLOCK_SIZE', 2048 );

  // ----- File list separator
  // In version 1.x of PclZip, the separator for file list is a space
  // (which is not a very smart choice, specifically for windows paths !).
  // A better separator should be a comma (,). This constant gives you the
  // abilty to change that.
  // However notice that changing this value, may have impact on existing
  // scripts, using space separated filenames.
  // Recommanded values for compatibility with older versions :
  //define( 'PCLZIP_SEPARATOR', ' ' );
  // Recommanded values for smart separation of filenames.
  define( 'PCLZIP_SEPARATOR', ',' );

  // ----- Error configuration
  // 0 : PclZip Class integrated error handling
  // 1 : PclError external library error handling. By enabling this
  // you must ensure that you have included PclError library.
  // [2,...] : reserved for futur use
  define( 'PCLZIP_ERROR_EXTERNAL', 0 );

  // ----- Optional static temporary directory
  //	By default temporary files are generated in the script current
  //	path.
  //	If defined :
  //	- MUST BE terminated by a '/'.
  //	- MUST be a valid, already created directory
  //	Samples :
  // define( 'PCLZIP_TEMPORARY_DIR', '/temp/' );
  // define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' );
  define( 'PCLZIP_TEMPORARY_DIR', '' );

// --------------------------------------------------------------------------------
// ***** UNDER THIS LINE NOTHING NEEDS TO BE MODIFIED *****
// --------------------------------------------------------------------------------

  // ----- Global variables
  $g_pclzip_version = "2.1";

  // ----- Error codes
  //	-1 : Unable to open file in binary write mode
  //	-2 : Unable to open file in binary read mode
  //	-3 : Invalid parameters
  //	-4 : File does not exist
  //	-5 : Filename is too long (max. 255)
  //	-6 : Not a valid zip file
  //	-7 : Invalid extracted file size
  //	-8 : Unable to create directory
  //	-9 : Invalid archive extension
  //  -10 : Invalid archive format
  //  -11 : Unable to delete file (unlink)
  //  -12 : Unable to rename file (rename)
  //  -13 : Invalid header checksum
  //  -14 : Invalid archive size
  define( 'PCLZIP_ERR_USER_ABORTED', 2 );
  define( 'PCLZIP_ERR_NO_ERROR', 0 );
  define( 'PCLZIP_ERR_WRITE_OPEN_FAIL', -1 );
  define( 'PCLZIP_ERR_READ_OPEN_FAIL', -2 );
  define( 'PCLZIP_ERR_INVALID_PARAMETER', -3 );
  define( 'PCLZIP_ERR_MISSING_FILE', -4 );
  define( 'PCLZIP_ERR_FILENAME_TOO_LONG', -5 );
  define( 'PCLZIP_ERR_INVALID_ZIP', -6 );
  define( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', -7 );
  define( 'PCLZIP_ERR_DIR_CREATE_FAIL', -8 );
  define( 'PCLZIP_ERR_BAD_EXTENSION', -9 );
  define( 'PCLZIP_ERR_BAD_FORMAT', -10 );
  define( 'PCLZIP_ERR_DELETE_FILE_FAIL', -11 );
  define( 'PCLZIP_ERR_RENAME_FILE_FAIL', -12 );
  define( 'PCLZIP_ERR_BAD_CHECKSUM', -13 );
  define( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14 );
  define( 'PCLZIP_ERR_MISSING_OPTION_VALUE', -15 );
  define( 'PCLZIP_ERR_INVALID_OPTION_VALUE', -16 );

  // ----- Options values
  define( 'PCLZIP_OPT_PATH', 77001 );
  define( 'PCLZIP_OPT_ADD_PATH', 77002 );
  define( 'PCLZIP_OPT_REMOVE_PATH', 77003 );
  define( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 );
  define( 'PCLZIP_OPT_SET_CHMOD', 77005 );
  define( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 );
  define( 'PCLZIP_OPT_NO_COMPRESSION', 77007 );
  define( 'PCLZIP_OPT_BY_NAME', 77008 );
  define( 'PCLZIP_OPT_BY_INDEX', 77009 );
  define( 'PCLZIP_OPT_BY_EREG', 77010 );
  define( 'PCLZIP_OPT_BY_PREG', 77011 );
  define( 'PCLZIP_OPT_COMMENT', 77012 );
  define( 'PCLZIP_OPT_ADD_COMMENT', 77013 );
  define( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 );
  define( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 );

  // ----- Call backs values
  define( 'PCLZIP_CB_PRE_EXTRACT', 78001 );
  define( 'PCLZIP_CB_POST_EXTRACT', 78002 );
  define( 'PCLZIP_CB_PRE_ADD', 78003 );
  define( 'PCLZIP_CB_POST_ADD', 78004 );
  /* For futur use
  define( 'PCLZIP_CB_PRE_LIST', 78005 );
  define( 'PCLZIP_CB_POST_LIST', 78006 );
  define( 'PCLZIP_CB_PRE_DELETE', 78007 );
  define( 'PCLZIP_CB_POST_DELETE', 78008 );
  */

  // --------------------------------------------------------------------------------
  // Class : PclZip
  // Description :
  //	PclZip is the class that represent a Zip archive.
  //	The public methods allow the manipulation of the archive.
  // Attributes :
  //	Attributes must not be accessed directly.
  // Methods :
  //	PclZip() : Object creator
  //	create() : Creates the Zip archive
  //	listContent() : List the content of the Zip archive
  //	extract() : Extract the content of the archive
  //	properties() : List the properties of the archive
  // --------------------------------------------------------------------------------
  class PclZip
  {
// ----- Filename of the zip file
var $zipname = '';

// ----- File descriptor of the zip file
var $zip_fd = 0;

// ----- Internal error handling
var $error_code = 1;
var $error_string = '';

  // --------------------------------------------------------------------------------
  // Function : PclZip()
  // Description :
  //	Creates a PclZip object and set the name of the associated Zip archive
  //	filename.
  //	Note that no real action is taken, if the archive does not exist it is not
  //	created. Use create() for that.
  // --------------------------------------------------------------------------------
  function PclZip($p_zipname)
  {
//--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::PclZip', "zipname=$p_zipname");

// ----- Tests the zlib
if (!function_exists('gzopen'))
{
  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 1, "zlib extension seems to be missing");
  die('Abort '.basename(__FILE__).' : Missing zlib extensions');
}

// ----- Set the attributes
$this->zipname = $p_zipname;
$this->zip_fd = 0;

// ----- Return
//--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 1);
return;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function :
  //	create($p_filelist, $p_add_dir="", $p_remove_dir="")
  //	create($p_filelist, $p_option, $p_option_value, ...)
  // Description :
  //	This method supports two different synopsis. The first one is historical.
  //	This method creates a Zip Archive. The Zip file is created in the
  //	filesystem. The files and directories indicated in $p_filelist
  //	are added in the archive. See the parameters description for the
  //	supported format of $p_filelist.
  //	When a directory is in the list, the directory and its content is added
  //	in the archive.
  //	In this synopsis, the function takes an optional variable list of
  //	options. See bellow the supported options.
  // Parameters :
  //	$p_filelist : An array containing file or directory names, or
  // a string containing one filename or one directory name, or
  // a string containing a list of filenames and/or directory
  // names separated by spaces.
  //	$p_add_dir : A path to add before the real path of the archived file,
  //in order to have it memorized in the archive.
  //	$p_remove_dir : A path to remove from the real path of the file to archive,
  //	in order to have a shorter path memorized in the archive.
  //	When $p_add_dir and $p_remove_dir are set, $p_remove_dir
  //	is removed first, before $p_add_dir is added.
  // Options :
  //	PCLZIP_OPT_ADD_PATH :
  //	PCLZIP_OPT_REMOVE_PATH :
  //	PCLZIP_OPT_REMOVE_ALL_PATH :
  //	PCLZIP_OPT_COMMENT :
  //	PCLZIP_CB_PRE_ADD :
  //	PCLZIP_CB_POST_ADD :
  // Return Values :
  //	0 on failure,
  //	The list of the added files, with a status of the add action.
  //	(see PclZip::listContent() for list entry format)
  // --------------------------------------------------------------------------------
//  function create($p_filelist, $p_add_dir="", $p_remove_dir="")
  function create($p_filelist /*, options */)
  {
//--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::create', "filelist='$p_filelist', ...");
$v_result=1;

// ----- Reset the error handler
$this->privErrorReset();

// ----- Set default values
$v_options = array();
$v_add_path = "";
$v_remove_path = "";
$v_remove_all_path = false;
$v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;

// ----- Look for variable options arguments
$v_size = func_num_args();
//--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");

// ----- Look for arguments
if ($v_size > 1) {
  // ----- Get the arguments
  $v_arg_list = &func_get_args();

  // ----- Remove form the options list the first argument
  array_shift($v_arg_list);
  $v_size--;

  // ----- Look for first arg
  if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
//--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected");

// ----- Parse the options
$v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
array (PCLZIP_OPT_REMOVE_PATH => 'optional',
	PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
	PCLZIP_OPT_ADD_PATH => 'optional',
	PCLZIP_CB_PRE_ADD => 'optional',
	PCLZIP_CB_POST_ADD => 'optional',
	PCLZIP_OPT_NO_COMPRESSION => 'optional',
	PCLZIP_OPT_COMMENT => 'optional' ));
if ($v_result != 1) {
  //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  return 0;
}

// ----- Set the arguments
if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
  $v_add_path = $v_options[PCLZIP_OPT_ADD_PATH];
}
if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
  $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
}
if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
  $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
}
  }

  // ----- Look for 2 args
  // Here we need to support the first historic synopsis of the
  // method.
  else {
//--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");

// ----- Get the first argument
$v_add_path = $v_arg_list[0];

// ----- Look for the optional second argument
if ($v_size == 2) {
  $v_remove_path = $v_arg_list[1];
}
else if ($v_size > 2) {
  // ----- Error log
  PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
			"Invalid number / type of arguments");

  // ----- Return
  //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  return 0;
}
  }
}

// ----- Trace
//--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "add_path='$v_add_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_all_path?'true':'false')."'");

// ----- Look if the $p_filelist is really an array
$p_result_list = array();
if (is_array($p_filelist))
{
  // ----- Call the create fct
  $v_result = $this->privCreate($p_filelist, $p_result_list, $v_add_path, $v_remove_path, $v_remove_all_path, $v_options);
}

// ----- Look if the $p_filelist is a string
else if (is_string($p_filelist))
{
  // ----- Create a list with the elements from the string
  $v_list = explode(PCLZIP_SEPARATOR, $p_filelist);

  // ----- Call the create fct
  $v_result = $this->privCreate($v_list, $p_result_list, $v_add_path, $v_remove_path, $v_remove_all_path, $v_options);
}

// ----- Invalid variable
else
{
  // ----- Error log
  PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");
  $v_result = PCLZIP_ERR_INVALID_PARAMETER;
}

if ($v_result != 1)
{
  // ----- Return
  //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  return 0;
}

// ----- Return
//--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list);
return $p_result_list;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function :
  //	add($p_filelist, $p_add_dir="", $p_remove_dir="")

⌨️ 快捷键说明

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