<?php
header('Content-type:text/html;charset=utf8');
Class FILE
{
private static $path;
private static $files = [];
private static $dirs = [];
private function __construct($path)
{
try {
if (is_dir($path)) {
self::$path = strtr($path, ['\\' => '/']);
}
} catch (\Exception $e) {
echo $e->getMessage();
}
}
private function runFiles($path)
{
$arr = ['files' => [], 'dirs' => [], 'all' => []];
$target = array_diff(scandir($path), ['.', '..']);
array_walk($target, function ($val, $key) use (&$arr, $path) {
$subTarget = "{$path}/{$val}";
if (is_file($subTarget)) {
array_push($arr['files'], "{$path}/" . $val);
} else if (is_dir($subTarget)) {
array_push($arr['dirs'], "{$path}/" . $val);
$arr = array_merge_recursive($arr, $this->runFiles($subTarget));
}
});
return $arr;
}
/**新建文件夹,如果目标文件夹不存在的情况下
* @param $target
* @return mixed
*/
private static function createFile($target)
{
if (!is_dir($target)) {
mkdir($target, 0777, true);
}
return $target;
}
/**判断是否是空的文件夹
* @param $dir
* @return bool
*/
private static function isEmptyDir($dir)
{
$arr = array_diff(scandir($dir), ['.', '..']);
return count($arr) == 0 ? true : false;
}
/**初始化
* @param $path
* @return FILE
*/
public static function init($path)
{
$cls = new self($path);
$all = $cls->runFiles(self::$path);
self::$files = $all['files'];
self::$dirs = $all['dirs'];
return $cls;
}
/**处理文件如复制或移动
* @param $target
* @param $mode
* @param $extension
* @return int
*/
private function dealFile($target, $mode, $extension)
{
$target = self::createFile($target);
$result = 0;
array_walk(self::$files, function ($val) use ($target, $extension, $mode, &$result) {
$info = pathinfo($val);
if (!$extension || ($extension && strcasecmp($info['extension'], $extension) == 0)) {
$res = strcasecmp($mode, 'move') == 0 ? rename($val, $target . '/' . $info['basename']) : copy($val, $target . '/' . $info['basename']);
if ($res) {
$result++;
}
}
});
return $result;
}
/**获取真实的文件路径
* @return array
*/
public function getRawFiles()
{
return self::$files;
}
/**获取真实的文件夹路径
* @return array
*/
public function getRawDirs()
{
return self::$dirs;
}
/**获取全部的文件名
* @return array
*/
public function getFiles()
{
$arr = [];
array_walk(self::$files, function ($val) use (&$arr) {
array_push($arr, basename($val));
});
return $arr;
}
/**获取所有的文件夹
* @return array
*/
public function getDirs()
{
$arr = [];
array_walk(self::$dirs, function ($val) use (&$arr) {
array_push($arr, basename($val));
});
return $arr;
}
/**获取树形结构图,注意这边的引用传值
* @return array
*/
public function getTree()
{
$all = array_merge(self::$dirs, self::$files);
$tree = [];
$diff = explode('/', self::$path);
if ($all) {
array_walk($all, function ($val) use ($diff, &$tree) {
$temp_arr = explode('/', $val);
if (is_file($val)) {
$file = end($temp_arr);
array_push($diff, $file);
}
$temp_arr = array_diff($temp_arr, $diff);
$parent =& $tree;
foreach ($temp_arr as $k => $v) {
if (!$parent[$v]) {
$parent[$v] = [];
}
$parent =& $parent[$v];
}
if (is_file($val)) {
array_push($parent, $file);
}
});
}
return $tree;
}
/**展示文件夹的信息
* @return array
*/
public function getInfo()
{
$files = self::$files;
$dirs = self::$dirs;
$size = 0;
array_walk($files, function ($val) use (&$size) {
$size += filesize($val);
});
return [
'size' => $size,
'dirs' => count($dirs),
'files' => count($files)
];
}
/**进行文件拷贝
* @param $target
* @param null $type
* @return int
*/
public function copyFiles($target, $type = null)
{
return $this->dealFile($target, 'copy', $type);
}
/**复制所有的空文件夹
* @param $target
* @return int
*/
public function copyDirs($target)
{
$dirs = self::$dirs;
$target = strtr(trim($target), ['\\' => '/']);
$target_arr = explode('/', $target);
if (end($target_arr) == '') {
array_pop($target_arr);
}
$diff = explode('/', self::$path);
$count = 0;
array_walk($dirs, function ($val) use (&$count, $target_arr, $diff) {
$temp_arr = array_diff(explode('/', $val), $diff);
$new_path = implode('/', $target_arr) . '/' . implode('/', $temp_arr);
if (mkdir($new_path, 0777, true)) {
$count++;
}
});
return $count;
}
/**文件的剪切
* @param $target
* @param null $type
* @return int
*/
public function moveFiles($target, $type = null)
{
return $this->dealFile($target, 'move', $type);
}
/**剪切所有的文件夹以及文件
* @param $target
* @return array
*/
public function moveAll($target)
{
$dirs = $this->copyDirs($target);
$files = self::$files;
$target_arr = explode('/', $target);
if (end($target_arr) == '') {
array_pop($target_arr);
}
$diff = explode('/', self::$path);
$count = 0;
array_walk($files, function ($val) use (&$count, $target_arr, $diff) {
$temp_arr = array_diff(explode('/', $val), $diff);
$new_path = implode('/', $target_arr) . '/' . implode('/', $temp_arr);
if (rename($val, $new_path)) {
$count++;
}
});
$this->removeAll();
return [
'files' => $count,
'dirs' => $dirs
];
}
/**删除指定目录下的所有文件
* @return int
*/
public function removeFiles()
{
$count = 0;
array_walk(self::$files, function ($val) use (&$count) {
if (unlink($val)) {
$count++;
}
});
return $count;
}
/**进行删除文件夹所有内容的操作
* @return bool
*/
public function removeAll()
{
$dirs = self::$dirs;
//进行文件夹排序
uasort($dirs, function ($m, $n) {
return strlen($m) > strlen($n) ? -1 : 1;
});
//删除所有文件
$this->removeFiles();
array_walk($dirs, function ($val) {
rmdir($val);
});
return self::isEmptyDir(self::$path);
}
}
$path = 'd:/filetest';
$target = 'd:/yftest';
//所有接口展示
//获取所有的文件名称,含完整路径
FILE::init($path)->getRawFiles();
//获取所有的文件名称,不含路径
FILE::init($path)->getFiles();
//获取所有的文件夹名称,含完整路径
FILE::init($path)->getRawDirs();
//获取所有的文件夹名称,不含路径
FILE::init($path)->getDirs();
//获取目标文件夹$path的树形结构图
FILE::init($path)->getTree();
//获取目标文件夹$path的信息
FILE::init($path)->getInfo();
//把$path下的所有文件复制到$target目录下,如果有指定类型的情况下,那么只复制指定类型的文件
FILE::init($path)->copyFiles($target, 'php');
//把$path下的所有文件夹复制到$target目录下,并且按$path的层级摆放
FILE::init($path)->copyDirs($target);
//把$path下的所有文件剪切到$taret目录下,如果有指定类型的情况下,那么只移动指定类型的文件
FILE::init($path)->moveFiles($target, 'php');
//把$path下的所有文件及文件夹移动到$target目录下,并且不改变原有的层级结构
FILE::init($path)->moveAll($target);
//删除指定文件夹下的所有文件,不含文件夹
FILE::init($path)->removeFiles();
//删除指定路径下的所有内容含文件,文件夹
FILE::init($path)->removeAll();
?>