Source filename or directory which will be renamed * 'target' => Target filename or directory, the new name of the sourcefile * 'overwrite' => Shall existing files be overwritten ? * * @param string|array $options Target file or directory to be renamed * @param string $target Source filename or directory (deprecated) * @param bool $overwrite Should existing files be overwritten (deprecated) * @return void */ public function __construct($options) { if ($options instanceof Zend_Config) { $options = $options->toArray(); } elseif (is_string($options)) { $options = array('target' => $options); } elseif (!is_array($options)) { #require_once 'Zend/Filter/Exception.php'; throw new Zend_Filter_Exception('Invalid options argument provided to filter'); } if (1 < func_num_args()) { $argv = func_get_args(); array_shift($argv); $source = array_shift($argv); $overwrite = false; if (!empty($argv)) { $overwrite = array_shift($argv); } $options['source'] = $source; $options['overwrite'] = $overwrite; } $this->setFile($options); } /** * Returns the files to rename and their new name and location * * @return array */ public function getFile() { return $this->_files; } /** * Sets a new file or directory as target, deleting existing ones * * Array accepts the following keys: * 'source' => Source filename or directory which will be renamed * 'target' => Target filename or directory, the new name of the sourcefile * 'overwrite' => Shall existing files be overwritten ? * * @param string|array $options Old file or directory to be rewritten * @return Zend_Filter_File_Rename */ public function setFile($options) { $this->_files = array(); $this->addFile($options); return $this; } /** * Adds a new file or directory as target to the existing ones * * Array accepts the following keys: * 'source' => Source filename or directory which will be renamed * 'target' => Target filename or directory, the new name of the sourcefile * 'overwrite' => Shall existing files be overwritten ? * * @param string|array $options Old file or directory to be rewritten * @return Zend_Filter_File_Rename */ public function addFile($options) { if (is_string($options)) { $options = array('target' => $options); } elseif (!is_array($options)) { #require_once 'Zend/Filter/Exception.php'; throw new Zend_Filter_Exception ('Invalid options to rename filter provided'); } $this->_convertOptions($options); return $this; } /** * Returns only the new filename without moving it * But existing files will be erased when the overwrite option is true * * @param string $value Full path of file to change * @param boolean $source Return internal informations * @return string The new filename which has been set */ public function getNewName($value, $source = false) { $file = $this->_getFileName($value); if (!is_array($file) || !array_key_exists('source', $file) || !array_key_exists('target', $file)) { return $value; } if ($file['source'] == $file['target']) { return $value; } if (!file_exists($file['source'])) { return $value; } if (($file['overwrite'] == true) && (file_exists($file['target']))) { unlink($file['target']); } if (file_exists($file['target'])) { #require_once 'Zend/Filter/Exception.php'; throw new Zend_Filter_Exception(sprintf("File '%s' could not be renamed. It already exists.", $value)); } if ($source) { return $file; } return $file['target']; } /** * Defined by Zend_Filter_Interface * * Renames the file $value to the new name set before * Returns the file $value, removing all but digit characters * * @param string $value Full path of file to change * @throws Zend_Filter_Exception * @return string The new filename which has been set, or false when there were errors */ public function filter($value) { $file = $this->getNewName($value, true); if (is_string($file)) { return $file; } $result = rename($file['source'], $file['target']); if ($result === true) { return $file['target']; } #require_once 'Zend/Filter/Exception.php'; throw new Zend_Filter_Exception(sprintf("File '%s' could not be renamed. An error occured while processing the file.", $value)); } /** * Internal method for creating the file array * Supports single and nested arrays * * @param array $options * @return array */ protected function _convertOptions($options) { $files = array(); foreach ($options as $key => $value) { if (is_array($value)) { $this->_convertOptions($value); continue; } switch ($key) { case "source": $files['source'] = (string) $value; break; case 'target' : $files['target'] = (string) $value; break; case 'overwrite' : $files['overwrite'] = (boolean) $value; break; default: break; } } if (empty($files)) { return $this; } if (empty($files['source'])) { $files['source'] = '*'; } if (empty($files['target'])) { $files['target'] = '*'; } if (empty($files['overwrite'])) { $files['overwrite'] = false; } $found = false; foreach ($this->_files as $key => $value) { if ($value['source'] == $files['source']) { $this->_files[$key] = $files; $found = true; } } if (!$found) { $count = count($this->_files); $this->_files[$count] = $files; } return $this; } /** * Internal method to resolve the requested source * and return all other related parameters * * @param string $file Filename to get the informations for * @return array */ protected function _getFileName($file) { $rename = array(); foreach ($this->_files as $value) { if ($value['source'] == '*') { if (!isset($rename['source'])) { $rename = $value; $rename['source'] = $file; } } if ($value['source'] == $file) { $rename = $value; } } if (!isset($rename['source'])) { return $file; } if (!isset($rename['target']) or ($rename['target'] == '*')) { $rename['target'] = $rename['source']; } if (is_dir($rename['target'])) { $name = basename($rename['source']); $last = $rename['target'][strlen($rename['target']) - 1]; if (($last != '/') and ($last != '\\')) { $rename['target'] .= DIRECTORY_SEPARATOR; } $rename['target'] .= $name; } return $rename; } }