File.php 8.6 KB

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