| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- <?php
- namespace extend;
- /**
- * 文件比对管理类
- * @author Administrator
- *
- */
- class FileManage
- {
- public $map = [];
- public $dir = [];
- public function mapCompare($map_old_path, $map_new_path)
- {
- $map_old = include_once $map_old_path;
- $map_new = include_once $map_new_path;
- $upgrade_map = [];
- //比对
- foreach ($map_new as $k => $v) {
- $check_path = isset($map_old[ $k ]) ? $map_old[ $k ] : '';
- if ($check_path != $v) {
- $upgrade_map[ $k ] = $v;
- }
- }
- return $upgrade_map;
- }
- /**
- * 创建文件夹
- *
- * @param string $path 文件夹路径
- * @param int $mode 访问权限
- * @param bool $recursive 是否递归创建
- * @return bool
- */
- public function dir_mkdir($path = '', $mode = 0777, $recursive = true)
- {
- clearstatcache();
- if (!is_dir($path)) {
- mkdir($path, $mode, $recursive);
- return chmod($path, $mode);
- }
- return true;
- }
- public function getDir($path)
- {
- if (is_dir($path)) {
- $dir = scandir($path);
- foreach ($dir as $value) {
- $sub_path = $path . '/' . $value;
- if ($value == '.' || $value == '..') {
- continue;
- } else if (is_dir($sub_path)) {
- $this->getDir($sub_path);
- } else {
- $this->dir[] = $path . '/' . $value;
- }
- }
- }
- }
- /**
- * 生成更新文件地图
- * @param $path
- * @return array
- */
- public function getFileMap($path)
- {
- $this->getDir($path);
- $array = [];
- if (!empty($this->dir)) {
- foreach ($this->dir as $k => $v) {
- $file = file_get_contents($v);
- $file_md5 = md5($file);
- $v = str_replace($path . '/', '', $v);
- $array[ $v ] = $file_md5;
- }
- }
- return $array;
- }
- /**
- * 解压文件
- * @param $filename
- * @param $path
- * @return array|string
- */
- public function unzip($filename, $path)
- {
- if (!file_exists($filename)) {
- return [ "code" => -1, "message" => '文件不存在' ];
- }
- //将文件名和路径转成windows系统默认的gb2312编码,否则将会读取不到
- $filename = iconv("utf-8", "gb2312", $filename);
- $path = iconv("utf-8", "gb2312", $path);
- //打开压缩包
- $resource = zip_open($filename);
- $i = 1;
- //遍历读取压缩包里面的一个个文件
- while ($dir_resource = zip_read($resource)) {
- //如果能打开则继续
- if (zip_entry_open($resource, $dir_resource)) {
- //获取当前项目的名称,即压缩包里面当前对应的文件名
- $file_name = $path . zip_entry_name($dir_resource);
- //以最后一个“/”分割,再用字符串截取出路径部分
- $file_path = substr($file_name, 0, strrpos($file_name, "/"));
- //如果路径不存在,则创建一个目录,true表示可以创建多级目录
- if (!is_dir($file_path)) {
- mkdir($file_path, 0777, true);
- }
- //如果不是目录,则写入文件
- if (!is_dir($file_name)) {
- //读取这个文件
- $file_size = zip_entry_filesize($dir_resource);
- //最大读取6M,如果文件过大,跳过解压,继续下一个
- if ($file_size < ( 1024 * 1024 * 50 )) {
- $file_content = zip_entry_read($dir_resource, $file_size);
- file_put_contents($file_name, $file_content);
- } else {
- return "<p> " . $i++ . " 此文件已被跳过,原因:文件过大, -> " . iconv("gb2312", "utf-8", $file_name) . " </p>";
- }
- }
- //关闭当前
- zip_entry_close($dir_resource);
- }
- }
- //关闭压缩包
- zip_close($resource);
- return [ "code" => 0, "message" => '解压完毕' ];
- }
- /**
- * 数组写入文件
- * @param $array
- * @param $path
- * @return mixed
- */
- public function arrayWrite($array, $path)
- {
- $str = '';
- foreach ($array as $k => $v) {
- if (empty($str)) {
- $str = "'$k' => '" . $v . "'" . ',';
- } else {
- $str = $str . "\n" . "'$k' => '" . $v . "'" . ',';
- }
- }
- $str = '<?php' . "\n" . ' return [' . "\n" . $str . "\n" . ']; ' . "\n" . '?>';
- $str = charsetToUTF8($str);
- file_put_contents($path, $str);
- return $path;
- }
- }
|