FileManage.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. namespace extend;
  3. /**
  4. * 文件比对管理类
  5. * @author Administrator
  6. *
  7. */
  8. class FileManage
  9. {
  10. public $map = [];
  11. public $dir = [];
  12. public function mapCompare($map_old_path, $map_new_path)
  13. {
  14. $map_old = include_once $map_old_path;
  15. $map_new = include_once $map_new_path;
  16. $upgrade_map = [];
  17. //比对
  18. foreach ($map_new as $k => $v) {
  19. $check_path = isset($map_old[ $k ]) ? $map_old[ $k ] : '';
  20. if ($check_path != $v) {
  21. $upgrade_map[ $k ] = $v;
  22. }
  23. }
  24. return $upgrade_map;
  25. }
  26. /**
  27. * 创建文件夹
  28. *
  29. * @param string $path 文件夹路径
  30. * @param int $mode 访问权限
  31. * @param bool $recursive 是否递归创建
  32. * @return bool
  33. */
  34. public function dir_mkdir($path = '', $mode = 0777, $recursive = true)
  35. {
  36. clearstatcache();
  37. if (!is_dir($path)) {
  38. mkdir($path, $mode, $recursive);
  39. return chmod($path, $mode);
  40. }
  41. return true;
  42. }
  43. public function getDir($path)
  44. {
  45. if (is_dir($path)) {
  46. $dir = scandir($path);
  47. foreach ($dir as $value) {
  48. $sub_path = $path . '/' . $value;
  49. if ($value == '.' || $value == '..') {
  50. continue;
  51. } else if (is_dir($sub_path)) {
  52. $this->getDir($sub_path);
  53. } else {
  54. $this->dir[] = $path . '/' . $value;
  55. }
  56. }
  57. }
  58. }
  59. /**
  60. * 生成更新文件地图
  61. * @param $path
  62. * @return array
  63. */
  64. public function getFileMap($path)
  65. {
  66. $this->getDir($path);
  67. $array = [];
  68. if (!empty($this->dir)) {
  69. foreach ($this->dir as $k => $v) {
  70. $file = file_get_contents($v);
  71. $file_md5 = md5($file);
  72. $v = str_replace($path . '/', '', $v);
  73. $array[ $v ] = $file_md5;
  74. }
  75. }
  76. return $array;
  77. }
  78. /**
  79. * 解压文件
  80. * @param $filename
  81. * @param $path
  82. * @return array|string
  83. */
  84. public function unzip($filename, $path)
  85. {
  86. if (!file_exists($filename)) {
  87. return [ "code" => -1, "message" => '文件不存在' ];
  88. }
  89. //将文件名和路径转成windows系统默认的gb2312编码,否则将会读取不到
  90. $filename = iconv("utf-8", "gb2312", $filename);
  91. $path = iconv("utf-8", "gb2312", $path);
  92. //打开压缩包
  93. $resource = zip_open($filename);
  94. $i = 1;
  95. //遍历读取压缩包里面的一个个文件
  96. while ($dir_resource = zip_read($resource)) {
  97. //如果能打开则继续
  98. if (zip_entry_open($resource, $dir_resource)) {
  99. //获取当前项目的名称,即压缩包里面当前对应的文件名
  100. $file_name = $path . zip_entry_name($dir_resource);
  101. //以最后一个“/”分割,再用字符串截取出路径部分
  102. $file_path = substr($file_name, 0, strrpos($file_name, "/"));
  103. //如果路径不存在,则创建一个目录,true表示可以创建多级目录
  104. if (!is_dir($file_path)) {
  105. mkdir($file_path, 0777, true);
  106. }
  107. //如果不是目录,则写入文件
  108. if (!is_dir($file_name)) {
  109. //读取这个文件
  110. $file_size = zip_entry_filesize($dir_resource);
  111. //最大读取6M,如果文件过大,跳过解压,继续下一个
  112. if ($file_size < ( 1024 * 1024 * 50 )) {
  113. $file_content = zip_entry_read($dir_resource, $file_size);
  114. file_put_contents($file_name, $file_content);
  115. } else {
  116. return "<p> " . $i++ . " 此文件已被跳过,原因:文件过大, -> " . iconv("gb2312", "utf-8", $file_name) . " </p>";
  117. }
  118. }
  119. //关闭当前
  120. zip_entry_close($dir_resource);
  121. }
  122. }
  123. //关闭压缩包
  124. zip_close($resource);
  125. return [ "code" => 0, "message" => '解压完毕' ];
  126. }
  127. /**
  128. * 数组写入文件
  129. * @param $array
  130. * @param $path
  131. * @return mixed
  132. */
  133. public function arrayWrite($array, $path)
  134. {
  135. $str = '';
  136. foreach ($array as $k => $v) {
  137. if (empty($str)) {
  138. $str = "'$k' => '" . $v . "'" . ',';
  139. } else {
  140. $str = $str . "\n" . "'$k' => '" . $v . "'" . ',';
  141. }
  142. }
  143. $str = '<?php' . "\n" . ' return [' . "\n" . $str . "\n" . ']; ' . "\n" . '?>';
  144. $str = charsetToUTF8($str);
  145. file_put_contents($path, $str);
  146. return $path;
  147. }
  148. }