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; } /** * Récupérer le contenu d'un fichier de l'archive à partir de son nom * * @param string $name le nom du fichier à extraire * @return le contenu du fichier dans une chaine de caractères */ 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; } /** * Ajouter un fichier à l'archive à partir d'une chaine de caractères * * @param string $localname le chemin local du fichier dans l'archive * @param string $contents le contenu du fichier * @return true si le fichier a été ajouté avec succès */ 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; } /** * Ajouter un fichier à l'archive à partir d'un fichier * * @param string $filename le chemin vers le fichier à ajouter * @param string $localname le chemin local du fichier dans l'archive * @return true si le fichier a été ajouté avec succès */ public function addFile($filename, $localname = null) { if (false === $this->openned) { return false; } if (file_exists($this->filename) && !is_writable($this->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; } /** * ferme l'archive Zip * @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; } /** * Vide le répertoire temporaire de travail récursivement * @param $dir le répertoire temporaire de travail * @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); } } } ?>