示例#1
0
文件: AkZip.php 项目: joeymetal/v1
 /**
  * AkZip::_deleteByRule()
  *
  * { Description }
  *
  */
 function _deleteByRule(&$p_result_list, &$p_params)
 {
     $v_result = 1;
     $v_list_detail = array();
     // ----- Open the zip file
     if (($v_result = $this->_openFd('rb')) != 1) {
         // ----- Return
         return $v_result;
     }
     // ----- Read the central directory informations
     $v_central_dir = array();
     if (($v_result = $this->_readEndCentralDir($v_central_dir)) != 1) {
         $this->_closeFd();
         return $v_result;
     }
     // ----- Go to beginning of File
     @rewind($this->_zip_fd);
     // ----- Scan all the files
     // ----- Start at beginning of Central Dir
     $v_pos_entry = $v_central_dir['offset'];
     @rewind($this->_zip_fd);
     if (@fseek($this->_zip_fd, $v_pos_entry)) {
         // ----- Clean
         $this->_closeFd();
         $this->_errorLog(AK_ZIP_ERR_INVALID_AK_ZIP, 'Invalid archive size');
         return AkZip::errorCode();
     }
     // ----- Read each entry
     $v_header_list = array();
     $j_start = 0;
     for ($i = 0, $v_nb_extracted = 0; $i < $v_central_dir['entries']; $i++) {
         // ----- Read the file header
         $v_header_list[$v_nb_extracted] = array();
         $v_result = $this->_readCentralFileHeader($v_header_list[$v_nb_extracted]);
         if ($v_result != 1) {
             // ----- Clean
             $this->_closeFd();
             return $v_result;
         }
         // ----- Store the index
         $v_header_list[$v_nb_extracted]['index'] = $i;
         // ----- Look for the specific extract rules
         $v_found = false;
         // ----- Look for extract by name rule
         if (isset($p_params[AK_ZIP_PARAM_BY_NAME]) && $p_params[AK_ZIP_PARAM_BY_NAME] != 0) {
             // ----- Look if the filename is in the list
             for ($j = 0; $j < sizeof($p_params[AK_ZIP_PARAM_BY_NAME]) && !$v_found; $j++) {
                 // ----- Look for a directory
                 if (substr($p_params[AK_ZIP_PARAM_BY_NAME][$j], -1) == "/") {
                     // ----- Look if the directory is in the filename path
                     if (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_params[AK_ZIP_PARAM_BY_NAME][$j]) && substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_params[AK_ZIP_PARAM_BY_NAME][$j])) == $p_params[AK_ZIP_PARAM_BY_NAME][$j]) {
                         $v_found = true;
                     } elseif (($v_header_list[$v_nb_extracted]['external'] & 0x10) == 0x10 && $v_header_list[$v_nb_extracted]['stored_filename'] . '/' == $p_params[AK_ZIP_PARAM_BY_NAME][$j]) {
                         $v_found = true;
                     }
                 } elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_params[AK_ZIP_PARAM_BY_NAME][$j]) {
                     $v_found = true;
                 }
             }
         } else {
             if (isset($p_params[AK_ZIP_PARAM_BY_EREG]) && $p_params[AK_ZIP_PARAM_BY_EREG] != "") {
                 if (ereg($p_params[AK_ZIP_PARAM_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
                     $v_found = true;
                 }
             } else {
                 if (isset($p_params[AK_ZIP_PARAM_BY_PREG]) && $p_params[AK_ZIP_PARAM_BY_PREG] != "") {
                     if (preg_match($p_params[AK_ZIP_PARAM_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
                         $v_found = true;
                     }
                 } else {
                     if (isset($p_params[AK_ZIP_PARAM_BY_INDEX]) && $p_params[AK_ZIP_PARAM_BY_INDEX] != 0) {
                         // ----- Look if the index is in the list
                         for ($j = $j_start; $j < sizeof($p_params[AK_ZIP_PARAM_BY_INDEX]) && !$v_found; $j++) {
                             if ($i >= $p_params[AK_ZIP_PARAM_BY_INDEX][$j]['start'] && $i <= $p_params[AK_ZIP_PARAM_BY_INDEX][$j]['end']) {
                                 $v_found = true;
                             }
                             if ($i >= $p_params[AK_ZIP_PARAM_BY_INDEX][$j]['end']) {
                                 $j_start = $j + 1;
                             }
                             if ($p_params[AK_ZIP_PARAM_BY_INDEX][$j]['start'] > $i) {
                                 break;
                             }
                         }
                     }
                 }
             }
         }
         // ----- Look for deletion
         if ($v_found) {
             unset($v_header_list[$v_nb_extracted]);
         } else {
             $v_nb_extracted++;
         }
     }
     // ----- Look if something need to be deleted
     if ($v_nb_extracted > 0) {
         // ----- Creates a temporay file
         $v_zip_temp_name = AK_ZIP_TEMPORARY_DIR . uniqid('archive_zip-') . '.tmp';
         // ----- Creates a temporary zip archive
         $v_temp_zip = new AkZip($v_zip_temp_name);
         // ----- Open the temporary zip file in write mode
         if (($v_result = $v_temp_zip->_openFd('wb')) != 1) {
             $this->_closeFd();
             // ----- Return
             return $v_result;
         }
         // ----- Look which file need to be kept
         for ($i = 0; $i < sizeof($v_header_list); $i++) {
             // ----- Calculate the position of the header
             @rewind($this->_zip_fd);
             if (@fseek($this->_zip_fd, $v_header_list[$i]['offset'])) {
                 // ----- Clean
                 $this->_closeFd();
                 $v_temp_zip->_closeFd();
                 @unlink($v_zip_temp_name);
                 $this->_errorLog(AK_ZIP_ERR_INVALID_AK_ZIP, 'Invalid archive size');
                 return AkZip::errorCode();
             }
             // ----- Read the file header
             if (($v_result = $this->_readFileHeader($v_header_list[$i])) != 1) {
                 // ----- Clean
                 $this->_closeFd();
                 $v_temp_zip->_closeFd();
                 @unlink($v_zip_temp_name);
                 return $v_result;
             }
             // ----- Write the file header
             $v_result = $v_temp_zip->_writeFileHeader($v_header_list[$i]);
             if ($v_result != 1) {
                 // ----- Clean
                 $this->_closeFd();
                 $v_temp_zip->_closeFd();
                 @unlink($v_zip_temp_name);
                 return $v_result;
             }
             // ----- Read/write the data block
             $v_result = $this->_tool_CopyBlock($this->_zip_fd, $v_temp_zip->_zip_fd, $v_header_list[$i]['compressed_size']);
             if ($v_result != 1) {
                 // ----- Clean
                 $this->_closeFd();
                 $v_temp_zip->_closeFd();
                 @unlink($v_zip_temp_name);
                 return $v_result;
             }
         }
         // ----- Store the offset of the central dir
         $v_offset = @ftell($v_temp_zip->_zip_fd);
         // ----- Re-Create the Central Dir files header
         for ($i = 0; $i < sizeof($v_header_list); $i++) {
             // ----- Create the file header
             $v_result = $v_temp_zip->_writeCentralFileHeader($v_header_list[$i]);
             if ($v_result != 1) {
                 // ----- Clean
                 $v_temp_zip->_closeFd();
                 $this->_closeFd();
                 @unlink($v_zip_temp_name);
                 return $v_result;
             }
             // ----- Transform the header to a 'usable' info
             $v_temp_zip->_convertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
         }
         // ----- Zip file comment
         $v_comment = '';
         // ----- Calculate the size of the central header
         $v_size = @ftell($v_temp_zip->_zip_fd) - $v_offset;
         // ----- Create the central dir footer
         $v_result = $v_temp_zip->_writeCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment);
         if ($v_result != 1) {
             // ----- Clean
             unset($v_header_list);
             $v_temp_zip->_closeFd();
             $this->_closeFd();
             @unlink($v_zip_temp_name);
             return $v_result;
         }
         // ----- Close
         $v_temp_zip->_closeFd();
         $this->_closeFd();
         // ----- Delete the zip file
         // TBC : I should test the result ...
         @unlink($this->_zipname);
         // ----- Rename the temporary file
         // TBC : I should test the result ...
         //@rename($v_zip_temp_name, $this->_zipname);
         $this->_tool_Rename($v_zip_temp_name, $this->_zipname);
         // ----- Destroy the temporary archive
         unset($v_temp_zip);
     }
     // ----- Return
     return $v_result;
 }