openned) { $this->close(); } if (!file_exists(self::TMP_DIR)) { mkdir(self::TMP_DIR); } $this->filename = $filename; $this->pclzip = new PclZip($this->filename); $this->openned = true; return true; } /** * Retrieve the content of a file within the archive from its name * * @param string $name the name of the file to extract * @return the content of the file in a string */ public function getFromName($name) { if (false === $this->openned) { return false; } $name = preg_replace("/(?:\.|\/)*(.*)/", "\\1", $name); $extraction = $this->pclzip->extract(PCLZIP_OPT_BY_NAME, $name, PCLZIP_OPT_EXTRACT_AS_STRING); if (!empty($extraction)) { return $extraction[0]['content']; } return false; } /** * Add a file within the archive from a string * * @param string $localname the local path to the file in the archive * @param string $contents the content of the file * @return true if the file has been successful added */ public function addFromString($localname, $contents) { if (false === $this->openned) { return false; } if (file_exists($this->filename) && !is_writable($this->filename)) { return false; } $localname = preg_replace("/(?:\.|\/)*(.*)/", "\\1", $localname); $localpath = dirname($localname); $tmpfilename = self::TMP_DIR . '/' . basename($localname); if (false !== file_put_contents($tmpfilename, $contents)) { $this->pclzip->delete(PCLZIP_OPT_BY_NAME, $localname); $add = $this->pclzip->add($tmpfilename, PCLZIP_OPT_REMOVE_PATH, self::TMP_DIR, PCLZIP_OPT_ADD_PATH, $localpath); unlink($tmpfilename); if (!empty($add)) { return true; } } return false; } /** * Add a file within the archive from a file * * @param string $filename the path to the file we want to add * @param string $localname the local path to the file in the archive * @return true if the file has been successful added */ public function addFile($filename, $localname = null) { if (false === $this->openned) { return false; } if ((file_exists($this->filename) && !is_writable($this->filename)) || !file_exists($filename)) { return false; } if (isSet($localname)) { $localname = preg_replace("/(?:\.|\/)*(.*)/", "\\1", $localname); $localpath = dirname($localname); $tmpfilename = self::TMP_DIR . '/' . basename($localname); } else { $localname = basename($filename); $tmpfilename = self::TMP_DIR . '/' . $localname; $localpath = ''; } if (file_exists($filename)) { copy($filename, $tmpfilename); $this->pclzip->delete(PCLZIP_OPT_BY_NAME, $localname); $this->pclzip->add($tmpfilename, PCLZIP_OPT_REMOVE_PATH, self::TMP_DIR, PCLZIP_OPT_ADD_PATH, $localpath); unlink($tmpfilename); return true; } return false; } /** * Close the Zip archive * @return true */ public function close() { if (false === $this->openned) { return false; } $this->pclzip = $this->filename = null; $this->openned = false; if (file_exists(self::TMP_DIR)) { $this->_rrmdir(self::TMP_DIR); rmdir(self::TMP_DIR); } return true; } /** * Empty the temporary working directory recursively * @param $dir the temporary working directory * @return void */ private function _rrmdir($dir) { if ($handle = opendir($dir)) { while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { if (is_dir($dir . '/' . $file)) { $this->_rrmdir($dir . '/' . $file); rmdir($dir . '/' . $file); } else { unlink($dir . '/' . $file); } } } closedir($handle); } } } ?>