File.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace extend;
  11. /**
  12. * 文件处理
  13. * @author Administrator
  14. *
  15. */
  16. class File
  17. {
  18. /**
  19. * 判断 文件/目录 是否可写(取代系统自带的 is_writeable 函数)
  20. *
  21. * @param string $file 文件/目录
  22. * @return boolean
  23. */
  24. public function is_write($file)
  25. {
  26. if (is_dir($file)) {
  27. $dir = $file;
  28. if ($fp = @fopen("$dir/test.txt", 'w')) {
  29. @fclose($fp);
  30. @unlink("$dir/test.txt");
  31. $writeable = true;
  32. } else {
  33. $writeable = false;
  34. }
  35. } else {
  36. if ($fp = @fopen($file, 'a+')) {
  37. @fclose($fp);
  38. $writeable = true;
  39. } else {
  40. $writeable = false;
  41. }
  42. }
  43. return $writeable;
  44. }
  45. /**
  46. * 文件尺寸大小
  47. * @param unknown $dir
  48. * @return number
  49. */
  50. public function get_dir_size($dir_path)
  51. {
  52. $size = 0;
  53. if (is_dir($dir_path)) {
  54. $handle = opendir($dir_path);
  55. while (false !== ($entry = readdir($handle))) {
  56. if ($entry != '.' && $entry != '..') {
  57. if (is_dir("{$dir_path}/{$entry}")) {
  58. $size += get_dir_size("{$dir_path}/{$entry}");
  59. } else {
  60. $size += filesize("{$dir_path}/{$entry}");
  61. }
  62. }
  63. }
  64. closedir($handle);
  65. }
  66. return $size;
  67. }
  68. /**
  69. * 文件尺寸大小换算
  70. * @param unknown $size
  71. * @return string
  72. */
  73. public function size_conversion($size_num)
  74. {
  75. switch ($size_num) {
  76. case $size_num >= 1073741824:
  77. $size_str = round($size_num / 1073741824 * 100) / 100 . ' GB';
  78. break;
  79. case $size_num >= 1048576:
  80. $size_str = round($size_num / 1048576 * 100) / 100 . ' MB';
  81. break;
  82. case $size_num >= 1024:
  83. $size_str = round($size_num / 1024 * 100) / 100 . ' KB';
  84. break;
  85. default:
  86. $size_str = $size_num . ' Bytes';
  87. break;
  88. }
  89. return $size_str;
  90. }
  91. /**
  92. * 删除指定目录下的文件和文件夹
  93. * @param unknown $dirpath
  94. * @return boolean
  95. */
  96. public function del_dir($dirpath)
  97. {
  98. $dh = opendir($dirpath);
  99. while (($file = readdir($dh)) !== false) {
  100. if ($file != "." && $file != "..") {
  101. $fullpath = $dirpath . "/" . $file;
  102. if (!is_dir($fullpath)) {
  103. unlink($fullpath);
  104. } else {
  105. $this->del_dir($fullpath);
  106. rmdir($fullpath);
  107. }
  108. }
  109. }
  110. closedir($dh);
  111. $isEmpty = true;
  112. $dh = opendir($dirpath);
  113. while (($file = readdir($dh)) !== false) {
  114. if ($file != "." && $file != "..") {
  115. $isEmpty = false;
  116. break;
  117. }
  118. }
  119. return $isEmpty;
  120. }
  121. /**
  122. * 文件强制下载
  123. * @param unknown $dir
  124. */
  125. public function dir_readfile($dir)
  126. {
  127. if (file_exists($dir)) {
  128. header('Content-Description: File Transfer');
  129. header('Content-Type: application/octet-stream');
  130. header('Content-Disposition: attachment; filename=' . basename($dir));
  131. header('Content-Transfer-Encoding: binary');
  132. header('Expires: 0');
  133. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  134. header('Pragma: public');
  135. header('Content-Length: ' . filesize($dir));
  136. ob_clean();
  137. flush();
  138. readfile($dir);
  139. }
  140. }
  141. /**
  142. * 压缩文件夹
  143. * @param unknown $dir
  144. * @param unknown $zipfile
  145. */
  146. public function zip_dir($dir, $zipfile, $newdir = '')
  147. {
  148. $zip = new ZipArchive();
  149. if ($zip->open($zipfile, ZipArchive::CREATE) === TRUE) {
  150. add_file_toZip($dir, $zip, $newdir); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
  151. $zip->close(); //关闭处理的zip文件
  152. }
  153. }
  154. /**
  155. * 读取文件单文件压缩 zipdir方法调用
  156. * @param unknown $dir
  157. * @param unknown $zip
  158. */
  159. public function add_file_toZip($dir, $zip, $newdir = '')
  160. {
  161. $handler = opendir($dir); //打开当前文件夹由$dir指定
  162. $filename = readdir($handler);
  163. while (($filename = readdir($handler)) !== false) {
  164. if ($filename != "." && $filename != "..") {//文件夹文件名字为'.'和‘..',不要对他们进行操作
  165. if (is_dir($dir . '/' . $filename)) {// 如果读取的某个对象是文件夹,则递归
  166. $this->add_file_toZip($dir . "/" . $filename, $zip, $newdir);
  167. } else { //将文件加入zip对象
  168. $new_dir_sep = substr($dir, strpos($dir, $newdir));
  169. $zip->addFile($dir . "/" . $filename, $new_dir_sep . '/' . $filename);
  170. }
  171. }
  172. }
  173. @closedir($dir);
  174. }
  175. /**
  176. * 将读取到的目录以数组的形式展现出来
  177. * @return array
  178. * opendir() 函数打开一个目录句柄,可由 closedir(),readdir() 和 rewinddir() 使用。
  179. * is_dir() 函数检查指定的文件是否是目录。
  180. * readdir() 函数返回由 opendir() 打开的目录句柄中的条目。
  181. * @param array $files 所有的文件条目的存放数组
  182. * @param string $file 返回的文件条目
  183. * @param string $dir 文件的路径
  184. * @param resource $handle 打开的文件目录句柄
  185. */
  186. public function dir_scan($dir)
  187. {
  188. //定义一个数组
  189. $files = array();
  190. //检测是否存在文件
  191. if (is_dir($dir)) {
  192. //打开目录
  193. if ($handle = opendir($dir)) {
  194. //返回当前文件的条目
  195. while (($file = readdir($handle)) !== false) {
  196. //去除特殊目录
  197. if ($file != "." && $file != "..") {
  198. //判断子目录是否还存在子目录
  199. if (is_dir($dir . "/" . $file)) {
  200. //递归调用本函数,再次获取目录
  201. $files[ $file ] = dir_scan($dir . "/" . $file);
  202. } else {
  203. //获取目录数组
  204. $files[] = $file;
  205. }
  206. }
  207. }
  208. //关闭文件夹
  209. closedir($handle);
  210. //返回文件夹数组
  211. return $files;
  212. }
  213. }
  214. }
  215. /**
  216. * 创建文件夹
  217. *
  218. * @param string $path 文件夹路径
  219. * @param int $mode 访问权限
  220. * @param bool $recursive 是否递归创建
  221. * @return bool
  222. */
  223. public function dir_mkdir($path = '', $mode = 0777, $recursive = true)
  224. {
  225. clearstatcache();
  226. if (!is_dir($path)) {
  227. mkdir($path, $mode, $recursive);
  228. return chmod($path, $mode);
  229. }
  230. return true;
  231. }
  232. /**
  233. * 文件夹文件拷贝
  234. *
  235. * @param string $src 来源文件夹
  236. * @param string $dst 目的地文件夹
  237. * @return bool
  238. */
  239. public function dir_copy($src = '', $dst = '')
  240. {
  241. if (empty($src) || empty($dst)) {
  242. return false;
  243. }
  244. $dir = opendir($src);
  245. $this->dir_mkdir($dst);
  246. while (false !== ($file = readdir($dir))) {
  247. if (($file != '.') && ($file != '..')) {
  248. if (is_dir($src . '/' . $file)) {
  249. $this->dir_copy($src . '/' . $file, $dst . '/' . $file);
  250. } else {
  251. copy($src . '/' . $file, $dst . '/' . $file);
  252. }
  253. }
  254. }
  255. closedir($dir);
  256. return true;
  257. }
  258. }