Aucune description
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Yzncms [ 御宅男工作室 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2018 http://yzncms.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: 御宅男 <530765310@qq.com>
  10. // +----------------------------------------------------------------------
  11. // +----------------------------------------------------------------------
  12. // | 文件及文件夹处理类
  13. // +----------------------------------------------------------------------
  14. namespace util;
  15. class File
  16. {
  17. /**
  18. * 创建目录
  19. * @param $dir 目录名
  20. * @return boolean true 成功, false 失败
  21. */
  22. public static function mk_dir($dir)
  23. {
  24. $dir = rtrim($dir, '/') . '/';
  25. if (!is_dir($dir)) {
  26. if (mkdir($dir, 0700, true) == false) {
  27. return false;
  28. }
  29. return true;
  30. }
  31. return true;
  32. }
  33. /**
  34. * 读取文件内容
  35. * @param $filename 文件名
  36. * @return string 文件内容
  37. */
  38. public static function read_file($filename)
  39. {
  40. $content = '';
  41. if (function_exists('file_get_contents')) {
  42. @$content = file_get_contents($filename);
  43. } else {
  44. if (@$fp = fopen($filename, 'r')) {
  45. @$content = fread($fp, filesize($filename));
  46. @fclose($fp);
  47. }
  48. }
  49. return $content;
  50. }
  51. /**
  52. * 写文件
  53. * @param $filename 文件名
  54. * @param $writetext 文件内容
  55. * @param $openmod 打开方式
  56. * @return boolean true 成功, false 失败
  57. */
  58. public static function write_file($filename, $writetext, $openmod = 'w')
  59. {
  60. if (@$fp = fopen($filename, $openmod)) {
  61. flock($fp, 2);
  62. fwrite($fp, $writetext);
  63. fclose($fp);
  64. return true;
  65. } else {
  66. return false;
  67. }
  68. }
  69. /**
  70. * 删除目录
  71. * @param $dirName 原目录
  72. * @return boolean true 成功, false 失败
  73. */
  74. public static function del_dir($dirName)
  75. {
  76. if (!file_exists($dirName)) {
  77. return false;
  78. }
  79. $dir = opendir($dirName);
  80. while ($fileName = readdir($dir)) {
  81. $file = $dirName . '/' . $fileName;
  82. if ($fileName != '.' && $fileName != '..') {
  83. if (is_dir($file)) {
  84. self::del_dir($file);
  85. } else {
  86. unlink($file);
  87. }
  88. }
  89. }
  90. closedir($dir);
  91. return rmdir($dirName);
  92. }
  93. /**
  94. * 复制目录
  95. * @param $surDir 原目录
  96. * @param $toDir 目标目录
  97. * @return boolean true 成功, false 失败
  98. */
  99. public static function copy_dir($surDir, $toDir)
  100. {
  101. $surDir = rtrim($surDir, '/') . '/';
  102. $toDir = rtrim($toDir, '/') . '/';
  103. if (!file_exists($surDir)) {
  104. return false;
  105. }
  106. if (!file_exists($toDir)) {
  107. self::mk_dir($toDir);
  108. }
  109. $file = opendir($surDir);
  110. while ($fileName = readdir($file)) {
  111. $file1 = $surDir . '/' . $fileName;
  112. $file2 = $toDir . '/' . $fileName;
  113. if ($fileName != '.' && $fileName != '..') {
  114. if (is_dir($file1)) {
  115. self::copy_dir($file1, $file2);
  116. } else {
  117. copy($file1, $file2);
  118. }
  119. }
  120. }
  121. closedir($file);
  122. return true;
  123. }
  124. /**
  125. * 列出目录
  126. * @param $dir 目录名
  127. * @return 目录数组。列出文件夹下内容,返回数组 $dirArray['dir']:存文件夹;$dirArray['file']:存文件
  128. */
  129. public static function get_dirs($dir)
  130. {
  131. $dir = rtrim($dir, '/') . '/';
  132. $dirArray[][] = null;
  133. if (false != ($handle = opendir($dir))) {
  134. $i = 0;
  135. $j = 0;
  136. while (false !== ($file = readdir($handle))) {
  137. if (is_dir($dir . $file)) {
  138. //判断是否文件夹
  139. $dirArray['dir'][$i] = $file;
  140. $i++;
  141. } else {
  142. $dirArray['file'][$j] = $file;
  143. $j++;
  144. }
  145. }
  146. closedir($handle);
  147. }
  148. return $dirArray;
  149. }
  150. /**
  151. * 取得目录下面的文件信息
  152. * @access public
  153. * @param mixed $pathname 路径
  154. */
  155. public static function listFile($pathname, $pattern = '*')
  156. {
  157. if (strpos($pattern, '|') !== false) {
  158. $patterns = explode('|', $pattern);
  159. } else {
  160. $patterns[0] = $pattern;
  161. }
  162. $i = 0;
  163. $dir = [];
  164. foreach ($patterns as $pattern) {
  165. $list = glob($pathname . $pattern);
  166. if ($list !== false) {
  167. foreach ($list as $file) {
  168. //$dir[$i]['filename'] = basename($file);
  169. //basename取中文名出问题.改用此方法
  170. //编码转换.把中文的调整一下.
  171. $dir[$i]['filename'] = preg_replace('/^.+[\\\\\\/]/', '', $file);
  172. $dir[$i]['pathname'] = realpath($file);
  173. $dir[$i]['owner'] = fileowner($file);
  174. $dir[$i]['perms'] = fileperms($file);
  175. $dir[$i]['inode'] = fileinode($file);
  176. $dir[$i]['group'] = filegroup($file);
  177. $dir[$i]['path'] = dirname($file);
  178. $dir[$i]['atime'] = fileatime($file);
  179. $dir[$i]['ctime'] = filectime($file);
  180. $dir[$i]['size'] = filesize($file);
  181. $dir[$i]['type'] = filetype($file);
  182. $dir[$i]['ext'] = is_file($file) ? strtolower(substr(strrchr(basename($file), '.'), 1)) : '';
  183. $dir[$i]['mtime'] = filemtime($file);
  184. $dir[$i]['isDir'] = is_dir($file);
  185. $dir[$i]['isFile'] = is_file($file);
  186. $dir[$i]['isLink'] = is_link($file);
  187. //$dir[$i]['isExecutable']= function_exists('is_executable')?is_executable($file):'';
  188. $dir[$i]['isReadable'] = is_readable($file);
  189. $dir[$i]['isWritable'] = is_writable($file);
  190. $i++;
  191. }
  192. }
  193. }
  194. // 对结果排序 保证目录在前面
  195. usort($dir, function ($a, $b) {
  196. if (($a["isDir"] && $b["isDir"]) || (!$a["isDir"] && !$b["isDir"])) {
  197. return $a["filename"] > $b["filename"] ? 1 : -1;
  198. } else {
  199. if ($a["isDir"]) {
  200. return -1;
  201. } elseif ($b["isDir"]) {
  202. return 1;
  203. }
  204. if ($a["filename"] == $b["filename"]) {
  205. return 0;
  206. }
  207. return $a["filename"] > $b["filename"] ? -1 : 1;
  208. }
  209. });
  210. return $dir;
  211. }
  212. /**
  213. * 统计文件夹大小
  214. * @param $dir 目录名
  215. * @return number 文件夹大小(单位 B)
  216. */
  217. public static function get_size($dir)
  218. {
  219. $dirlist = opendir($dir);
  220. $dirsize = 0;
  221. while (false !== ($folderorfile = readdir($dirlist))) {
  222. if ($folderorfile != "." && $folderorfile != "..") {
  223. if (is_dir("$dir/$folderorfile")) {
  224. $dirsize += self::get_size("$dir/$folderorfile");
  225. } else {
  226. $dirsize += filesize("$dir/$folderorfile");
  227. }
  228. }
  229. }
  230. closedir($dirlist);
  231. return $dirsize;
  232. }
  233. /**
  234. * 检测是否为空文件夹
  235. * @param $dir 目录名
  236. * @return boolean true 空, fasle 不为空
  237. */
  238. public static function empty_dir($dir)
  239. {
  240. return (($files = @scandir($dir)) && count($files) <= 2);
  241. }
  242. /**
  243. * 移除空目录
  244. * @param string $dir 目录
  245. */
  246. public static function remove_empty_folder($dir)
  247. {
  248. try {
  249. $isDirEmpty = !(new \FilesystemIterator($dir))->valid();
  250. if ($isDirEmpty) {
  251. @rmdir($dir);
  252. self::remove_empty_folder(dirname($dir));
  253. }
  254. } catch (\UnexpectedValueException $e) {
  255. } catch (\Exception $e) {
  256. }
  257. }
  258. /**
  259. * 文件缓存与文件读取
  260. * @param $name 文件名
  261. * @param $value 文件内容,为空则获取缓存
  262. * @param $path 文件所在目录,默认是当前应用的DATA目录
  263. * @param $cached 是否缓存结果,默认缓存
  264. * @return 返回缓存内容
  265. */
  266. public function cache($name, $value = '', $path = DATA_PATH, $cached = true)
  267. {
  268. static $_cache = array();
  269. $filename = $path . $name . '.php';
  270. if ('' !== $value) {
  271. if (is_null($value)) {
  272. // 删除缓存
  273. return false !== strpos($name, '*') ? array_map("unlink", glob($filename)) : unlink($filename);
  274. } else {
  275. // 缓存数据
  276. $dir = dirname($filename);
  277. // 目录不存在则创建
  278. if (!is_dir($dir)) {
  279. mkdir($dir, 0755, true);
  280. }
  281. $_cache[$name] = $value;
  282. return file_put_contents($filename, strip_whitespace("<?php\treturn " . var_export($value, true) . ";?>"));
  283. }
  284. }
  285. if (isset($_cache[$name]) && $cached == true) {
  286. return $_cache[$name];
  287. }
  288. // 获取缓存数据
  289. if (is_file($filename)) {
  290. $value = include $filename;
  291. $_cache[$name] = $value;
  292. } else {
  293. $value = false;
  294. }
  295. return $value;
  296. }
  297. /**
  298. * 判断文件或文件夹是否可写.
  299. * @param string $file 文件或目录
  300. * @return bool
  301. */
  302. public static function is_really_writable($file)
  303. {
  304. if (DIRECTORY_SEPARATOR === '/') {
  305. return is_writable($file);
  306. }
  307. if (is_dir($file)) {
  308. $file = rtrim($file, '/') . '/' . md5(mt_rand());
  309. if (($fp = @fopen($file, 'ab')) === false) {
  310. return false;
  311. }
  312. fclose($fp);
  313. @chmod($file, 0777);
  314. @unlink($file);
  315. return true;
  316. } elseif (!is_file($file) or ($fp = @fopen($file, 'ab')) === false) {
  317. return false;
  318. }
  319. fclose($fp);
  320. return true;
  321. }
  322. }