FileService.php 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: pengyong <i@pengyong.info>
  10. // +----------------------------------------------------------------------
  11. namespace crmeb\services;
  12. class FileService
  13. {
  14. /*
  15. @function 创建目录
  16. @var:$filename 目录名
  17. @return: true
  18. */
  19. static public function mk_dir($dir)
  20. {
  21. $dir = rtrim($dir,'/').'/';
  22. if(!is_dir($dir))
  23. {
  24. if(mkdir($dir, 0700)==false)
  25. {
  26. return false;
  27. }
  28. return true;
  29. }
  30. return true;
  31. }
  32. /*
  33. @function 写文件
  34. @var:$filename 文件名
  35. @var:$writetext 文件内容
  36. @var:$openmod 打开方式
  37. @return: 成功=true
  38. */
  39. static function write_file($filename, $writetext, $openmod='w')
  40. {
  41. if(@$fp = fopen($filename, $openmod))
  42. {
  43. flock($fp, 2);
  44. fwrite($fp, $writetext);
  45. fclose($fp);
  46. return true;
  47. }
  48. else
  49. {
  50. return false;
  51. }
  52. }
  53. /*
  54. @function 删除目录
  55. @var:$dirName 原目录
  56. @return: 成功=true
  57. */
  58. static function del_dir($dirName)
  59. {
  60. if (!file_exists($dirName))
  61. {
  62. return false;
  63. }
  64. $dir = opendir($dirName);
  65. while ($fileName = readdir($dir))
  66. {
  67. $file = $dirName . '/' . $fileName;
  68. if ($fileName != '.' && $fileName != '..')
  69. {
  70. if (is_dir($file))
  71. {
  72. self::del_dir($file);
  73. }
  74. else
  75. {
  76. unlink($file);
  77. }
  78. }
  79. }
  80. closedir($dir);
  81. return rmdir($dirName);
  82. }
  83. /*
  84. @function 复制目录
  85. @var:$surDir 原目录
  86. @var:$toDir 目标目录
  87. @return: true
  88. */
  89. public function copy_dir($surDir,$toDir)
  90. {
  91. $surDir = rtrim($surDir,'/').'/';
  92. $toDir = rtrim($toDir,'/').'/';
  93. if (!file_exists($surDir))
  94. {
  95. return false;
  96. }
  97. if (!file_exists($toDir))
  98. {
  99. $this->create_dir($toDir);
  100. }
  101. $file = opendir($surDir);
  102. while ($fileName = readdir($file))
  103. {
  104. $file1 = $surDir .'/'.$fileName;
  105. $file2 = $toDir .'/'.$fileName;
  106. if ($fileName != '.' && $fileName != '..')
  107. {
  108. if (is_dir($file1))
  109. {
  110. self::copy_dir($file1, $file2);
  111. }
  112. else
  113. {
  114. copy($file1, $file2);
  115. }
  116. }
  117. }
  118. closedir($file);
  119. return true;
  120. }
  121. /*
  122. @function 列出目录
  123. @var:$dir 目录名
  124. @return: 目录数组
  125. 列出文件夹下内容,返回数组 $dirArray['dir']:存文件夹;$dirArray['file']:存文件
  126. */
  127. static function get_dirs($dir)
  128. {
  129. $dir = rtrim($dir,'/').'/';
  130. $dirArray [][] = NULL;
  131. if (false != ($handle = opendir ( $dir )))
  132. {
  133. $i = 0;
  134. $j = 0;
  135. while ( false !== ($file = readdir ( $handle )) )
  136. {
  137. if (is_dir ( $dir . $file ))
  138. { //判断是否文件夹
  139. $dirArray ['dir'] [$i] = $file;
  140. $i ++;
  141. }
  142. else
  143. {
  144. $dirArray ['file'] [$j] = $file;
  145. $j ++;
  146. }
  147. }
  148. closedir ($handle);
  149. }
  150. return $dirArray;
  151. }
  152. /*
  153. @function 统计文件夹大小
  154. @var:$dir 目录名
  155. @return: 文件夹大小(单位 B)
  156. */
  157. static function get_size($dir)
  158. {
  159. $dirlist = opendir($dir);
  160. $dirsize = 0;
  161. while (false !== ($folderorfile = readdir($dirlist)))
  162. {
  163. if($folderorfile != "." && $folderorfile != "..")
  164. {
  165. if (is_dir("$dir/$folderorfile"))
  166. {
  167. $dirsize += self::get_size("$dir/$folderorfile");
  168. }
  169. else
  170. {
  171. $dirsize += filesize("$dir/$folderorfile");
  172. }
  173. }
  174. }
  175. closedir($dirlist);
  176. return $dirsize;
  177. }
  178. /*
  179. @function 检测是否为空文件夹
  180. @var:$dir 目录名
  181. @return: 存在则返回true
  182. */
  183. static function empty_dir($dir)
  184. {
  185. return (($files = @scandir($dir)) && count($files) <= 2);
  186. }
  187. /**
  188. * 创建多级目录
  189. * @param string $dir
  190. * @param int $mode
  191. * @return boolean
  192. */
  193. public function create_dir($dir,$mode=0777)
  194. {
  195. return is_dir($dir) or ($this->create_dir(dirname($dir)) and mkdir($dir, $mode));
  196. }
  197. /**
  198. * 创建指定路径下的指定文件
  199. * @param string $path(需要包含文件名和后缀)
  200. * @param boolean $over_write 是否覆盖文件
  201. * @param int $time 设置时间。默认是当前系统时间
  202. * @param int $atime 设置访问时间。默认是当前系统时间
  203. * @return boolean
  204. */
  205. public function create_file($path,$over_write=FALSE,$time=NULL,$atime=NULL)
  206. {
  207. $path = $this->dir_replace($path);
  208. $time = empty($time) ? time() : $time;
  209. $atime = empty($atime) ? time() : $atime;
  210. if(file_exists($path) && $over_write)
  211. {
  212. $this->unlink_file($path);
  213. }
  214. $aimDir = dirname($path);
  215. $this->create_dir($aimDir);
  216. return touch($path,$time,$atime);
  217. }
  218. /**
  219. * 关闭文件操作
  220. * @param string $path
  221. * @return boolean
  222. */
  223. public function close($path)
  224. {
  225. return fclose($path);
  226. }
  227. /**
  228. * 读取文件操作
  229. * @param string $file
  230. * @return boolean
  231. */
  232. public static function read_file($file)
  233. {
  234. return @file_get_contents($file);
  235. }
  236. /**
  237. * 确定服务器的最大上传限制(字节数)
  238. * @return int 服务器允许的最大上传字节数
  239. */
  240. public function allow_upload_size()
  241. {
  242. $val = trim(ini_get('upload_max_filesize'));
  243. return $val;
  244. }
  245. /**
  246. * 字节格式化 把字节数格式为 B K M G T P E Z Y 描述的大小
  247. * @param int $size 大小
  248. * @param int $dec 显示类型
  249. * @return int
  250. */
  251. public static function byte_format($size,$dec=2)
  252. {
  253. $a = array("B", "KB", "MB", "GB", "TB", "PB","EB","ZB","YB");
  254. $pos = 0;
  255. while ($size >= 1024)
  256. {
  257. $size /= 1024;
  258. $pos++;
  259. }
  260. return round($size,$dec)." ".$a[$pos];
  261. }
  262. /**
  263. * 删除非空目录
  264. * 说明:只能删除非系统和特定权限的文件,否则会出现错误
  265. * @param string $dirName 目录路径
  266. * @param boolean $is_all 是否删除所有
  267. * @param boolean $del_dir 是否删除目录
  268. * @return boolean
  269. */
  270. public function remove_dir($dir_path,$is_all=FALSE)
  271. {
  272. $dirName = $this->dir_replace($dir_path);
  273. $handle = @opendir($dirName);
  274. while (($file = @readdir($handle)) !== FALSE)
  275. {
  276. if($file != '.' && $file != '..')
  277. {
  278. $dir = $dirName . '/' . $file;
  279. if($is_all)
  280. {
  281. is_dir($dir) ? $this->remove_dir($dir) : $this->unlink_file($dir);
  282. }
  283. else
  284. {
  285. if(is_file($dir))
  286. {
  287. $this->unlink_file($dir);
  288. }
  289. }
  290. }
  291. }
  292. closedir($handle);
  293. return @rmdir($dirName);
  294. }
  295. /**
  296. * 获取完整文件名
  297. * @param string $fn 路径
  298. * @return string
  299. */
  300. public function get_basename($file_path)
  301. {
  302. $file_path = $this->dir_replace($file_path);
  303. return basename(str_replace('\\', '/', $file_path));
  304. //return pathinfo($file_path,PATHINFO_BASENAME);
  305. }
  306. /**
  307. * 获取文件后缀名
  308. * @param string $file_name 文件路径
  309. * @return string
  310. */
  311. public static function get_ext($file)
  312. {
  313. $file = self::dir_replace($file);
  314. //return strtolower(substr(strrchr(basename($file), '.'),1));
  315. //return end(explode(".",$filename ));
  316. //return strtolower(trim(array_pop(explode('.', $file))));//取得后缀
  317. //return preg_replace('/.*\.(.*[^\.].*)*/iU','\\1',$file);
  318. return pathinfo($file,PATHINFO_EXTENSION);
  319. }
  320. /**
  321. * 取得指定目录名称
  322. * @param string $path 文件路径
  323. * @param int $num 需要返回以上级目录的数
  324. * @return string
  325. */
  326. public function father_dir($path,$num=1)
  327. {
  328. $path = $this->dir_replace($path);
  329. $arr = explode('/',$path);
  330. if ($num == 0 || count($arr)<$num) return pathinfo($path,PATHINFO_BASENAME);
  331. return substr(strrev($path),0,1) == '/' ? $arr[(count($arr)-(1+$num))] : $arr[(count($arr)-$num)];
  332. }
  333. /**
  334. * 删除文件
  335. * @param string $path
  336. * @return boolean
  337. */
  338. public function unlink_file($path)
  339. {
  340. $path = $this->dir_replace($path);
  341. if (file_exists($path))
  342. {
  343. return unlink($path);
  344. }
  345. }
  346. /**
  347. * 文件操作(复制/移动)
  348. * @param string $old_path 指定要操作文件路径(需要含有文件名和后缀名)
  349. * @param string $new_path 指定新文件路径(需要新的文件名和后缀名)
  350. * @param string $type 文件操作类型
  351. * @param boolean $overWrite 是否覆盖已存在文件
  352. * @return boolean
  353. */
  354. public function handle_file($old_path,$new_path,$type='copy',$overWrite=FALSE)
  355. {
  356. $old_path = $this->dir_replace($old_path);
  357. $new_path = $this->dir_replace($new_path);
  358. if(file_exists($new_path) && $overWrite=FALSE)
  359. {
  360. return FALSE;
  361. }
  362. else if(file_exists($new_path) && $overWrite=TRUE)
  363. {
  364. $this->unlink_file($new_path);
  365. }
  366. $aimDir = dirname($new_path);
  367. $this->create_dir($aimDir);
  368. switch ($type)
  369. {
  370. case 'copy':
  371. return copy($old_path,$new_path);
  372. break;
  373. case 'move':
  374. return @rename($old_path,$new_path);
  375. break;
  376. }
  377. }
  378. /**
  379. * 文件夹操作(复制/移动)
  380. * @param string $old_path 指定要操作文件夹路径
  381. * @param string $aimDir 指定新文件夹路径
  382. * @param string $type 操作类型
  383. * @param boolean $overWrite 是否覆盖文件和文件夹
  384. * @return boolean
  385. */
  386. public function handle_dir($old_path,$new_path,$type='copy',$overWrite=FALSE)
  387. {
  388. $new_path = $this->check_path($new_path);
  389. $old_path = $this->check_path($old_path);
  390. if (!is_dir($old_path)) return FALSE;
  391. if (!file_exists($new_path)) $this->create_dir($new_path);
  392. $dirHandle = opendir($old_path);
  393. if (!$dirHandle) return FALSE;
  394. $boolean = TRUE;
  395. while(FALSE !== ($file=readdir($dirHandle)))
  396. {
  397. if ($file=='.' || $file=='..') continue;
  398. if (!is_dir($old_path.$file))
  399. {
  400. $boolean = $this->handle_file($old_path.$file,$new_path.$file,$type,$overWrite);
  401. }
  402. else
  403. {
  404. $this->handle_dir($old_path.$file,$new_path.$file,$type,$overWrite);
  405. }
  406. }
  407. switch ($type)
  408. {
  409. case 'copy':
  410. closedir($dirHandle);
  411. return $boolean;
  412. break;
  413. case 'move':
  414. closedir($dirHandle);
  415. return @rmdir($old_path);
  416. break;
  417. }
  418. }
  419. /**
  420. * 替换相应的字符
  421. * @param string $path 路径
  422. * @return string
  423. */
  424. public static function dir_replace($path)
  425. {
  426. return str_replace('//','/',str_replace('\\','/',$path));
  427. }
  428. /**
  429. * 读取指定路径下模板文件
  430. * @param string $path 指定路径下的文件
  431. * @return string $rstr
  432. */
  433. public static function get_templtes($path)
  434. {
  435. $path = self::dir_replace($path);
  436. if(file_exists($path))
  437. {
  438. $fp = fopen($path,'r');
  439. $rstr = fread($fp,filesize($path));
  440. fclose($fp);
  441. return $rstr;
  442. }
  443. else
  444. {
  445. return '';
  446. }
  447. }
  448. /**
  449. * 文件重命名
  450. * @param string $oldname
  451. * @param string $newname
  452. */
  453. public function rename($oldname,$newname)
  454. {
  455. if(($newname!=$oldname) && is_writable($oldname))
  456. {
  457. return rename($oldname,$newname);
  458. }
  459. }
  460. /**
  461. * 获取指定路径下的信息
  462. * @param string $dir 路径
  463. * @return ArrayObject
  464. */
  465. public function get_dir_info($dir)
  466. {
  467. $handle = @opendir($dir);//打开指定目录
  468. $directory_count = 0;
  469. $total_size = 0;
  470. $file_cout = 0;
  471. while (FALSE !== ($file_path = readdir($handle)))
  472. {
  473. if($file_path != "." && $file_path != "..")
  474. {
  475. //is_dir("$dir/$file_path") ? $sizeResult += $this->get_dir_size("$dir/$file_path") : $sizeResult += filesize("$dir/$file_path");
  476. $next_path = $dir.'/'.$file_path;
  477. if (is_dir($next_path))
  478. {
  479. $directory_count++;
  480. $result_value = self::get_dir_info($next_path);
  481. $total_size += $result_value['size'];
  482. $file_cout += $result_value['filecount'];
  483. $directory_count += $result_value['dircount'];
  484. }
  485. elseif (is_file($next_path))
  486. {
  487. $total_size += filesize($next_path);
  488. $file_cout++;
  489. }
  490. }
  491. }
  492. closedir($handle);//关闭指定目录
  493. $result_value['size'] = $total_size;
  494. $result_value['filecount'] = $file_cout;
  495. $result_value['dircount'] = $directory_count;
  496. return $result_value;
  497. }
  498. /**
  499. * 指定文件编码转换
  500. * @param string $path 文件路径
  501. * @param string $input_code 原始编码
  502. * @param string $out_code 输出编码
  503. * @return boolean
  504. */
  505. public function change_file_code($path,$input_code,$out_code)
  506. {
  507. if(is_file($path))//检查文件是否存在,如果存在就执行转码,返回真
  508. {
  509. $content = file_get_contents($path);
  510. $content = string::chang_code($content,$input_code,$out_code);
  511. $fp = fopen($path,'w');
  512. return fputs($fp,$content) ? TRUE : FALSE;
  513. fclose($fp);
  514. }
  515. }
  516. /**
  517. * 指定目录下指定条件文件编码转换
  518. * @param string $dirname 目录路径
  519. * @param string $input_code 原始编码
  520. * @param string $out_code 输出编码
  521. * @param boolean $is_all 是否转换所有子目录下文件编码
  522. * @param string $exts 文件类型
  523. * @return boolean
  524. */
  525. public function change_dir_files_code($dirname,$input_code,$out_code,$is_all=TRUE,$exts='')
  526. {
  527. if(is_dir($dirname))
  528. {
  529. $fh = opendir($dirname);
  530. while (($file = readdir($fh)) !== FALSE)
  531. {
  532. if (strcmp($file , '.')==0 || strcmp($file , '..')==0)
  533. {
  534. continue;
  535. }
  536. $filepath = $dirname.'/'.$file;
  537. if (is_dir($filepath) && $is_all==TRUE)
  538. {
  539. $files = $this->change_dir_files_code($filepath,$input_code,$out_code,$is_all,$exts );
  540. }
  541. else
  542. {
  543. if($this->get_ext($filepath) == $exts && is_file($filepath))
  544. {
  545. $boole = $this->change_file_code($filepath,$input_code,$out_code,$is_all,$exts);
  546. if(!$boole) continue;
  547. }
  548. }
  549. }
  550. closedir($fh);
  551. return TRUE;
  552. }
  553. else
  554. {
  555. return FALSE;
  556. }
  557. }
  558. /**
  559. * 列出指定目录下符合条件的文件和文件夹
  560. * @param string $dirname 路径
  561. * @param boolean $is_all 是否列出子目录中的文件
  562. * @param string $exts 需要列出的后缀名文件
  563. * @param string $sort 数组排序
  564. * @return ArrayObject
  565. */
  566. public function list_dir_info($dirname,$is_all=FALSE,$exts='',$sort='ASC')
  567. {
  568. //处理多于的/号
  569. $new = strrev($dirname);
  570. if(strpos($new,'/')==0)
  571. {
  572. $new = substr($new,1);
  573. }
  574. $dirname = strrev($new);
  575. $sort = strtolower($sort);//将字符转换成小写
  576. $files = array();
  577. $subfiles = array();
  578. if(is_dir($dirname))
  579. {
  580. $fh = opendir($dirname);
  581. while (($file = readdir($fh)) !== FALSE)
  582. {
  583. if (strcmp($file, '.')==0 || strcmp($file, '..')==0) continue;
  584. $filepath = $dirname.'/'.$file;
  585. switch ($exts)
  586. {
  587. case '*':
  588. if (is_dir($filepath) && $is_all==TRUE)
  589. {
  590. $files = array_merge($files,self::list_dir_info($filepath,$is_all,$exts,$sort));
  591. }
  592. array_push($files,$filepath);
  593. break;
  594. case 'folder':
  595. if (is_dir($filepath) && $is_all==TRUE)
  596. {
  597. $files = array_merge($files,self::list_dir_info($filepath,$is_all,$exts,$sort));
  598. array_push($files,$filepath);
  599. }
  600. elseif (is_dir($filepath))
  601. {
  602. array_push($files,$filepath);
  603. }
  604. break;
  605. case 'file':
  606. if (is_dir($filepath) && $is_all==TRUE)
  607. {
  608. $files = array_merge($files,self::list_dir_info($filepath,$is_all,$exts,$sort));
  609. }
  610. elseif (is_file($filepath))
  611. {
  612. array_push($files, $filepath);
  613. }
  614. break;
  615. default:
  616. if (is_dir($filepath) && $is_all==TRUE)
  617. {
  618. $files = array_merge($files,self::list_dir_info($filepath,$is_all,$exts,$sort));
  619. }
  620. elseif(preg_match("/\.($exts)/i",$filepath) && is_file($filepath))
  621. {
  622. array_push($files, $filepath);
  623. }
  624. break;
  625. }
  626. switch ($sort)
  627. {
  628. case 'asc':
  629. sort($files);
  630. break;
  631. case 'desc':
  632. rsort($files);
  633. break;
  634. case 'nat':
  635. natcasesort($files);
  636. break;
  637. }
  638. }
  639. closedir($fh);
  640. return $files;
  641. }
  642. else
  643. {
  644. return FALSE;
  645. }
  646. }
  647. /**
  648. * 返回指定路径的文件夹信息,其中包含指定路径中的文件和目录
  649. * @param string $dir
  650. * @return ArrayObject
  651. */
  652. public function dir_info($dir)
  653. {
  654. return scandir($dir);
  655. }
  656. /**
  657. * 判断目录是否为空
  658. * @param string $dir
  659. * @return boolean
  660. */
  661. public function is_empty($dir)
  662. {
  663. $handle = opendir($dir);
  664. while (($file = readdir($handle)) !== false)
  665. {
  666. if ($file != '.' && $file != '..')
  667. {
  668. closedir($handle);
  669. return true;
  670. }
  671. }
  672. closedir($handle);
  673. return false;
  674. }
  675. /**
  676. * 返回指定文件和目录的信息
  677. * @param string $file
  678. * @return ArrayObject
  679. */
  680. public static function list_info($file)
  681. {
  682. $dir = array();
  683. $dir['filename'] = basename($file);//返回路径中的文件名部分。
  684. $dir['pathname'] = strstr(php_uname('s'),'Windows') ? str_replace('\\','\\\\',realpath($file)) : realpath($file);//返回绝对路径名。
  685. $dir['owner'] = fileowner($file);//文件的 user ID (所有者)。
  686. $dir['perms'] = fileperms($file);//返回文件的 inode 编号。
  687. $dir['inode'] = fileinode($file);//返回文件的 inode 编号。
  688. $dir['group'] = filegroup($file);//返回文件的组 ID。
  689. $dir['path'] = dirname($file);//返回路径中的目录名称部分。
  690. $dir['atime'] = fileatime($file);//返回文件的上次访问时间。
  691. $dir['ctime'] = filectime($file);//返回文件的上次改变时间。
  692. $dir['perms'] = fileperms($file);//返回文件的权限。
  693. $dir['size'] = self::byte_format(filesize($file),2);//返回文件大小。
  694. $dir['type'] = filetype($file);//返回文件类型。
  695. $dir['ext'] = is_file($file) ? pathinfo($file,PATHINFO_EXTENSION) : '';//返回文件后缀名
  696. $dir['mtime'] = filemtime($file);//返回文件的上次修改时间。
  697. $dir['isDir'] = is_dir($file);//判断指定的文件名是否是一个目录。
  698. $dir['isFile'] = is_file($file);//判断指定文件是否为常规的文件。
  699. $dir['isLink'] = is_link($file);//判断指定的文件是否是连接。
  700. $dir['isReadable'] = is_readable($file);//判断文件是否可读。
  701. $dir['isWritable'] = is_writable($file);//判断文件是否可写。
  702. $dir['isUpload'] = is_uploaded_file($file);//判断文件是否是通过 HTTP POST 上传的。
  703. return $dir;
  704. }
  705. /**
  706. * 返回关于打开文件的信息
  707. * @param $file
  708. * @return ArrayObject
  709. * 数字下标 关联键名(自 PHP 4.0.6) 说明
  710. * 0 dev 设备名
  711. * 1 ino 号码
  712. * 2 mode inode 保护模式
  713. * 3 nlink 被连接数目
  714. * 4 uid 所有者的用户 id
  715. * 5 gid 所有者的组 id
  716. * 6 rdev 设备类型,如果是 inode 设备的话
  717. * 7 size 文件大小的字节数
  718. * 8 atime 上次访问时间(Unix 时间戳)
  719. * 9 mtime 上次修改时间(Unix 时间戳)
  720. * 10 ctime 上次改变时间(Unix 时间戳)
  721. * 11 blksize 文件系统 IO 的块大小
  722. * 12 blocks 所占据块的数目
  723. */
  724. public function open_info($file)
  725. {
  726. $file = fopen($file,"r");
  727. $result = fstat($file);
  728. fclose($file);
  729. return $result;
  730. }
  731. /**
  732. * 改变文件和目录的相关属性
  733. * @param string $file 文件路径
  734. * @param string $type 操作类型
  735. * @param string $ch_info 操作信息
  736. * @return boolean
  737. */
  738. public function change_file($file,$type,$ch_info)
  739. {
  740. switch ($type)
  741. {
  742. case 'group' : $is_ok = chgrp($file,$ch_info);//改变文件组。
  743. break;
  744. case 'mode' : $is_ok = chmod($file,$ch_info);//改变文件模式。
  745. break;
  746. case 'ower' : $is_ok = chown($file,$ch_info);//改变文件所有者。
  747. break;
  748. }
  749. }
  750. /**
  751. * 取得文件路径信息
  752. * @param $full_path 完整路径
  753. * @return ArrayObject
  754. */
  755. public function get_file_type($path)
  756. {
  757. //pathinfo() 函数以数组的形式返回文件路径的信息。
  758. //---------$file_info = pathinfo($path); echo file_info['extension'];----------//
  759. //extension取得文件后缀名【pathinfo($path,PATHINFO_EXTENSION)】-----dirname取得文件路径【pathinfo($path,PATHINFO_DIRNAME)】-----basename取得文件完整文件名【pathinfo($path,PATHINFO_BASENAME)】-----filename取得文件名【pathinfo($path,PATHINFO_FILENAME)】
  760. return pathinfo($path);
  761. }
  762. /**
  763. * 取得上传文件信息
  764. * @param $file file属性信息
  765. * @return array
  766. */
  767. public function get_upload_file_info($file)
  768. {
  769. $file_info = $_FILES[$file];//取得上传文件基本信息
  770. $info = array();
  771. $info['type'] = strtolower(trim(stripslashes(preg_replace("/^(.+?);.*$/", "\\1", $file_info['type'])), '"'));//取得文件类型
  772. $info['temp'] = $file_info['tmp_name'];//取得上传文件在服务器中临时保存目录
  773. $info['size'] = $file_info['size'];//取得上传文件大小
  774. $info['error'] = $file_info['error'];//取得文件上传错误
  775. $info['name'] = $file_info['name'];//取得上传文件名
  776. $info['ext'] = $this->get_ext($file_info['name']);//取得上传文件后缀
  777. return $info;
  778. }
  779. /**
  780. * 设置文件命名规则
  781. * @param string $type 命名规则
  782. * @param string $filename 文件名
  783. * @return string
  784. */
  785. public function set_file_name($type)
  786. {
  787. switch ($type)
  788. {
  789. case 'hash' : $new_file = md5(uniqid(mt_rand()));//mt_srand()以随机数md5加密来命名
  790. break;
  791. case 'time' : $new_file = time();
  792. break;
  793. default : $new_file = date($type,time());//以时间格式来命名
  794. break;
  795. }
  796. return $new_file;
  797. }
  798. /**
  799. * 文件保存路径处理
  800. * @return string
  801. */
  802. public function check_path($path)
  803. {
  804. return (preg_match('/\/$/',$path)) ? $path : $path . '/';
  805. }
  806. /**
  807. * 文件下载
  808. * $save_dir 保存路径
  809. * $filename 文件名
  810. * @return array
  811. */
  812. public static function down_remote_file($url,$save_dir='',$filename='',$type=0){
  813. if(trim($url)==''){
  814. return array('file_name'=>'','save_path'=>'','error'=>1);
  815. }
  816. if(trim($save_dir)==''){
  817. $save_dir='./';
  818. }
  819. if(trim($filename)==''){//保存文件名
  820. $ext=strrchr($url,'.');
  821. // if($ext!='.gif'&&$ext!='.jpg'){
  822. // return array('file_name'=>'','save_path'=>'','error'=>3);
  823. // }
  824. $filename=time().$ext;
  825. }
  826. if(0!==strrpos($save_dir,'/')){
  827. $save_dir.='/';
  828. }
  829. //创建保存目录
  830. if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){
  831. return array('file_name'=>'','save_path'=>'','error'=>5);
  832. }
  833. //获取远程文件所采用的方法
  834. if($type){
  835. $ch=curl_init();
  836. $timeout=5;
  837. curl_setopt($ch,CURLOPT_URL,$url);
  838. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  839. curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
  840. $img=curl_exec($ch);
  841. curl_close($ch);
  842. }else{
  843. ob_start();
  844. readfile($url);
  845. $img=ob_get_contents();
  846. ob_end_clean();
  847. }
  848. //$size=strlen($img);
  849. //文件大小
  850. $fp2=fopen($save_dir.$filename,'a');
  851. fwrite($fp2,$img);
  852. fclose($fp2);
  853. unset($img,$url);
  854. return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
  855. }
  856. public static function zipopen($filename,$savename){
  857. $zip = new \ZipArchive;
  858. $zipfile = $filename;
  859. $res = $zip->open($zipfile);
  860. $toDir = $savename;
  861. if(!file_exists($toDir)) mkdir($toDir,0777);
  862. $docnum = $zip->numFiles;
  863. for($i = 0; $i < $docnum; $i++) {
  864. $statInfo = $zip->statIndex($i);
  865. if($statInfo['crc'] == 0 && $statInfo['comp_size']!=2){
  866. //新建目录
  867. mkdir($toDir.'/'.substr($statInfo['name'], 0,-1),0777);
  868. } else {
  869. //拷贝文件
  870. copy('zip://'.$zipfile.'#'.$statInfo['name'], $toDir.'/'.$statInfo['name']);
  871. }
  872. }
  873. $zip->close();
  874. return true;
  875. }
  876. /**
  877. *设置字体格式
  878. *@param $title string 必选
  879. * return string
  880. */
  881. public static function setUtf8($title){
  882. return iconv('utf-8', 'gb2312', $title);
  883. }
  884. /**
  885. *检查指定文件是否能写入
  886. *@param $file string 必选
  887. * return boole
  888. */
  889. public static function isWritable($file){
  890. $file = str_replace('\\','/',$file);
  891. if(!file_exists($file)) return false;
  892. return is_writable($file);
  893. }
  894. }