![](https://img.kancloud.cn/bb/97/bb9770f0c37e3d4236737e8dcd8b3ba0_461x154.png) 文件目录如上 1、文件处理扩展包File.php ``` <?php namespace files; class File { /** * 判断文件是否存在 * * @name f_has * @param string filename 文件路径 * @return bool */ public function f_has($filename = '') { $is = is_file($filename); return $is ? 1 : 0; } /** * 判断文件夹是否存在 * * @name d_has * @param string dir 目录 * @return bool */ public function d_has($dir = '') { $is = is_dir($dir); return $is ? 1 : 0; } /** * 创建目录 * * @name d_create * @param string dir 目录 * @return bool */ public function d_create($dir = '') { if (!$dir || $dir == "." || $dir == "./") return true; if (!$this -> d_has($dir)) { $is = mkdir($dir, 0777, true); return $is ? 1 : 0; } return 1; } /** * 文件写入 * * @name write * @param string filename 文件路径 * @param string data 文件中要写入的内容 * @return bool */ public function write($filename = '', $data = '') { $pathinfo = pathinfo($filename); $dir = $pathinfo['dirname']; $file = $pathinfo['basename']; if (!$this->d_has($dir)) { mkdir($dir, 0777, true); } $is = file_put_contents($filename, $data); return $is ? 1 : 0; } /** * 文件读取 * * @name read * @param string filename 文件路径 * @return string */ public function read($filename = '') { if ($this->f_has($filename)) { $content = file_get_contents($filename); return $content; } else { return ''; } } /** * 读取文件内容,将读取的内容放入数组中,每个数组元素为文件的一行,内容包括换行 * * @name read_array * @param string filename 文件路径 * @return array */ public function read_array($filename = "") { if ($this->f_has($filename)) { return file($filename); } else { return array(); } } public function read_line_trim($filename = "", $tp = "#", $line_size = '1024') { $arr_ = []; if ($this->f_has($filename)) { $handle = fopen($filename, "r"); while (!feof ($handle)) { $buffer = fgets($handle, $line_size); $f_str = trim($buffer); if (!empty($f_str) && substr($f_str, 0, 1 ) != $tp) { array_push($arr_,$f_str); } } fclose($handle); } return $arr_; } /** * 文件删除 * * @name f_delete * @param string filename 文件路径 * @return array */ public function f_delete($filename = "") { if ($this -> f_has($filename)) { return @unlink($filename); } } /** * 文件夹删除 * * @name d_delete * @param string filename 文件路径 * @return array */ public function d_delete($dir = "") { // 先删除目录下的文件: if (!$this->d_has($dir)) return true; $dh = opendir($dir); while ($file = readdir($dh)) { if ($file != "." && $file != "..") { $fullpath = $dir . DIRECTORY_SEPARATOR . $file; if (!is_dir($fullpath)) { @unlink($fullpath); } else { $this -> d_delete($fullpath); } } } closedir($dh); // 删除当前文件夹: if (rmdir($dir)) { return true; } else { return false; } } /** * 拷贝文件或目录 * * @name copy_ * @param string $new 拷贝目录或者文件 * @param string $old 目标目录或者文件 * @param $type $type 0为删除拷贝目录 1为不删除拷贝目录 * @return bool */ public function copy_($new, $old, $type = 1) { $is = false; if (!file_exists($old) && !is_dir($old)) return false; $pathinfo_new = pathinfo($new); $path = isset($pathinfo_new['extension']) ? $pathinfo_new['dirname'] : $new; if (!is_dir($path)) mkdir($path, 0777, true); if (is_file($old)) { if (!isset($pathinfo_new['extension'])) { $pathinfo = pathinfo($old); $is = copy($old, $new . DIRECTORY_SEPARATOR . $pathinfo['basename']); } else { $is = copy($old, $new); } } else { if (!isset($pathinfo_new['extension'])) { $dir = scandir($old); foreach ($dir as $filename) { if (!in_array($filename, array('.', '..'))) { if (is_dir($old . DIRECTORY_SEPARATOR . $filename)) { $is = $this -> copy_($new . DIRECTORY_SEPARATOR . $filename, $old . DIRECTORY_SEPARATOR . $filename, $type); if (!$is) return false; continue; } else { $is = copy($old . DIRECTORY_SEPARATOR . $filename, $new . DIRECTORY_SEPARATOR . $filename); } } } } } return $is; } /** * 获取目录下的所有文件路劲 包括子目录的文件 * * @name get_all_dir * @param string dir 文件夹路径 * @return array */ public function get_all_dir($dir) { $result = array(); $handle = opendir($dir); if ($handle) { while (($file = readdir($handle)) !== false) { if ($file != '.' && $file != '..') { $cur_path = $dir . DIRECTORY_SEPARATOR . $file; if (is_dir($cur_path)) { $files = $this -> get_all_dir($cur_path); if ($files) $result = $result ? array_merge($result, $files) : $files; } else { $result[] = $cur_path; } } } closedir($handle); } return $result; } /** * 判断文件或者文件夹是否有对象权限 * * @name is_write * @param string $file 文件或者文件夹路径 * @return int */ function is_write($file) { $pathinfo = pathinfo($file); $dir = $pathinfo['dirname']; $extension = isset($pathinfo_new['extension']) ? $pathinfo_new['extension'] : NULL; if ($extension) { $is = $this -> write($file); return $is ? 1 : 0; } else { $filename = substr($file, 0, 1) == "/" ? $file . "is_write_000000123456789.txt" : $file . DIRECTORY_SEPARATOR . "is_write_000000123456789.txt"; $is = $this -> write($filename, 'OK'); if ($is) { $this -> f_delete($filename); return 1; } else { return 0; } } } } ``` 2、压缩包处理扩展包Zip.php ``` <?php namespace files; class Zip { /** * 初始化函数 * * @name __construct * @return void */ public function __construct() { $this->zip = new \ZipArchive(); $this->F = new \files\File(); } /** * 压缩单个文件 * * @name add_file * @param string $filename 被压缩的文件 * @param string filename_zip 在压缩文件中的文件名称,如果不设置为压缩文件的名称,默认不设置 * @return int 1 or 0 */ public function add_file($filename, $filename_zip = null) { if ($filename_zip) { $is = $this->zip->addFile($filename, $filename_zip); } else { $is = $this->zip->addFile($filename); } return $is ? 1 : 0; } /** * 压缩整个目录 * * @name zip * @param string $dir 压缩目录路径 * @param string $zipfilename 压缩文件的文件名,包括路径 * @return int 1 or 0 */ public function zip($dir, $zipfilename = 'zip.zip') { $pathinfo = pathinfo($zipfilename); if ($this->F->d_create($pathinfo['dirname'])) { // ZipArchive::OVERWRITE 如果文件存在则覆盖 if ($this->zip->open($zipfilename, \ZipArchive::CREATE) === TRUE) { $this->createZip($dir); } return $this->zip->close(); } return 0; } /** * 解压缩文件 * * @name unzip * @param string $zipfilename 解压缩的文件 * @param string $path 解压缩后的路径 * @return int 1 or 0 */ public function unzip($zipfilename = 'zip.zip', $path = '') { if ($this->zip->open($zipfilename) === true) { $file_tmp = @fopen($zipfilename, "rb"); // 只读15字节 各个不同文件类型,头信息不一样。 $bin = fread($file_tmp, 15); fclose($file_tmp); // 只针对zip的压缩包进行处理 if (true === $this->getTypeList($bin)) { $result = $this->zip->extractTo($path); $this->zip->close(); return $result ? 1 : 0; } else { return 0; } } return 0; } /** * 添加目录到zip对象 * * @name createZip * @param string $dir 压缩目录路径 * @param string $parent 上级目录 * @return int */ public function createZip($dir, $parent = null) { $handle = opendir($dir); if ($handle) { try { while ( ( $file = readdir ( $handle ) ) !== false ) { if ( $file != '.' && $file != '..') { $cur_path = $dir . DIRECTORY_SEPARATOR . $file; if ( is_dir ( $cur_path ) ) { $parentParam = $parent ? $parent . "/" . $file : $file; $this->createZip($cur_path, $parentParam); } else { $filename_zip = $parent ? $parent . "/" . $file : $file; $this->add_file($cur_path, $filename_zip); } } } closedir($handle); return 1; } catch(\Exception $e) { return 0; } } } /** * 获取压缩文件的列表 * * @name get_list * @param string $zipfilename 压缩文件 * @return array */ public function get_list($zipfilename="zip.zip") { $file_dir_list = array(); $file_list = array(); if ($this->zip->open($zipfilename) == true) { for ($i = 0; $i < $this->zip->numFiles; $i++) { $numfiles = $this->zip->getNameIndex($i); if (preg_match('/\/$/i', $numfiles)) { $file_dir_list[] = $numfiles; } else { $file_list[] = $numfiles; } } } return array('files'=>$file_list, 'dirs'=>$file_dir_list); } /** * 得到文件头与文件类型映射表 * * @name getTypeList * @param string $bin 文件的二进制前一段字符 * @return bool */ public function getTypeList($bin) { $array = [ ["504B0304", "zip"] ]; foreach ($array as $v) { $blen = strlen(pack("H*", $v[0])); //得到文件头标记字节数 $tbin = substr($bin, 0, intval($blen)); ///需要比较文件头长度 if (strtolower($v[0]) == array_shift(unpack("H*", $tbin))) { return true; } } return true; } } ```