KevenHuang
2017-02-16 19:17:32浏览 2859
<?php
/**
*开源项目:所有关于文件目录操作的功能
*操作1:文件上传功能
*操作2:文件下载
*操作3:查看单级目录结构
*操作4:递归查看目录结构
*操作5:查看文件或文件夹的大小
*操作6:按关键字递归查找文件
*操作7:递归删除非空目录
*操作8:递归删除空目录
*操作9:递归创建目录
*操作10:剪切目录或文件
*/
class File{
/**
*文件上传
*@param $file array 要上传的文件数组信息
*@param $allow array 允许上传的文件类型
*@param $size int 允许上传文件的大小
*@param $path string 上传文件保存的路径
*@return $fileName string 文件上传成功后的新文件名
*/
public function upload($file,$allow,$size,$path='./upload'){
//判断上传文件是否是一个合理的文件
if(!is_array($file)){
echo '上传文件不是一个合理的文件';
return false;
}
//判断上传文件是否是允许上传文件的类型
if(!in_array($file['type'],$allow)){
echo '不允许上传的文件类型';
return false;
}
//判断上传文件的大小是否符合允许上传文件的大小
if($file['size']>$size){
echo '上传文件大小超过允许上传文件大小';
return false;
}
//判断文件是否是通过HTTP POST上传的
if(!is_uploaded_file($file['tmp_name'])){
echo '文件不是通过http上传的';
return false;
}
//文件上传错误判断
if($file['error']>0){
switch($file['error']){
case 1:
echo '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值';
return false;
break;
case 2:
echo '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
return false;
break;
case 3:
echo '文件只有部分被上传';
return false;
break;
case 4:
echo '没有文件被上传';
return false;
break;
case 6:
echo '找不到临时文件夹';
return false;
break;
case 7:
echo '文件写入失败';
return false;
break;
}
}
//判断上传文件保存路径是否存在
if(!file_exists($path)){
mkdir($path);
}
//生成新的文件名
$newName = $this->getNewFileName($file['name']);
if(move_uploaded_file($file['tmp_name'],$path.'/'.$newName)){
return $newName;
}else{
echo '文件上传失败';
return false;
}
}
/**
*文件下载
*@param $filePath string 要下载的文件的路径
*/
public function downLoad($filePath){
$basename = basename($filePath);
header("Content-Type:application/octet-stream");
header("Content-Disposition:attachment;filename=".$basename);
echo file_get_contents($filePath);
}
/**
*生成新的文件名
*@param $oldName string 旧的文件名
*@return $newName string 新的文件名
*/
public function getNewFileName($oldName){
$newName = '';
//获取文件的后缀名
$ext = pathinfo($oldName)['extension'];
//生成六位随机数
$chars = array_merge(range('a','z'),range('A','Z'));
//打乱数组的顺序
shuffle($chars);
$newName .= implode(array_slice($chars,0,6),'');
$newName .= time();
$newName .= '.'.$ext;
return $newName;
}
/**
*查看单级目录结构
*@param $path string 要查看的目录路径
*@param $arr array 目录结构
*/
public function showDiretory($path){
$arr = array();
//判断路径是否存在
if(!file_exists($path)){
echo '文件或目录不存在';
return false;
}
if(is_dir($path)){
$handle = opendir($path);
while(false !== $file = readdir($handle)){
$subPath = $path . '/' . $file;
if(is_dir($subPath)){
$arr['dir'][] = $file;
}else{
$arr['file'][] = $file;
}
}
closedir($handle);
}else{
$arr['file'][] = basename($path);
}
return $arr;
}
/**
*递归查看目录结构
*@param $path string 目录路径
*@return $arr array 目录结构
*/
public function showDiretorys($path){
static $arr = array();
//判断路径是否存在
if(!file_exists($path)){
echo '文件或目录不存在';
return false;
}
if(is_dir($path)){
$handle = opendir($path);
$flag = true;
while(false !== $file = readdir($handle)){
$subPath = $path . '/' . $file;
$subPath = str_replace('//','/',$subPath);
if($file=='.'||$file=='..'){
continue;
}
if(is_dir($subPath)){
$this->showDiretorys($subPath);
}else{
$flag = false;
$arr[dirname($subPath)][] = $file;
}
if($flag){
$arr[$path] = null;
}
}
closedir($handle);
}else{
$arr[] = $path;
}
return $arr;
}
/**
*查看文件或文件夹的大小
*@param $path string 要查看大小的文件或目录路径
*@return $size float 文件或目录的大小
*/
public function dirSize($path){
static $size = 0;
//判断文件或目录是否存在
if(!file_exists($path)){
echo '文件或目录不存在';
return false;
}
if(is_dir($path)){
$handle = opendir($path);
while(false !== $file = readdir($handle)){
$subPath = $path . '/' . $file;
if($file=='.'||$file=='..'){
continue;
}
if(is_dir($subPath)){
$this->getSize($subPath);
}else{
$size += filesize($subPath);
}
}
closedir($handle);
}else{
return filesize($path);
}
return $this->getSize($size);
}
/**
*返回带有单位的文件大小
*@param $size int 原始的文件大小
*@return $hsize float 带有单位的文件大小
*/
public function getSize($size){
$arr = array('Byte','KB','MB','GB','TB');
$i = 0;
while($size>1024){
$size /= 1024;
$i++;
}
$hsize = round($size,2);
$hsize .= $arr[$i];
return $hsize;
}
/**
*按关键字递归查找文件
*@param $path string 要查找文件的目录
*@param $keyword string 要查找的关键字
*@return $files array 查找到的文件数组
*/
public function findFilesByKeyword($path,$keyword){
static $files = array();
//判断文件或目录是否存在
if(!file_exists($path)){
echo '文件或目录不存在';
return false;
}
if(is_dir($path)){
$handle = opendir($path);
while(false !== $file = readdir($handle)){
$subPath = $path . '/' . $file;
$subPath = str_replace('//','/',$subPath);
if($file=='.'||$file=='..'){
continue;
}
if(is_dir($subPath)){
$this->findFilesByKeyword($subPath,$keyword);
}else{
if(strpos($file,$keyword)!==false){
$files[] = $subPath;
}
}
}
closedir($handle);
}
return $files;
}
/**
*递归删除非空目录
*@param $path string 要删除的目录
*/
public function deleteDir($path){
//判断目录是否存在
if(!file_exists($path)){
echo '文件或目录不存在';
return false;
}
if(is_dir($path)){
$handle = opendir($path);
while(false !== $file = readdir($handle)){
if($file=='.'||$file=='..'){
continue;
}
$subPath = $path . '/' . $file;
if(is_dir($subPath)){
$this->deleteDir($subPath);
}else{
unlink($subPath);
}
}
closedir($handle);
if(rmdir($path)){
return true;
}else{
echo '删除失败';
return false;
}
}else{
unlink($path);
}
}
/**
*递归删除空目录
*@param $path string 要删除的目录路径
*/
public function deleteEmptyDir($path){
//判断目录路径是否存在
if(!file_exists($path)){
echo '文件或目录不存在';
return false;
}
if(is_dir($path)){
$handle = opendir($path);
$flag = true;
while(false !== $file = readdir($handle)){
if($file=='.'||$file=='..'){
continue;
}
$subPath = $path . '/' . $file;
if(is_dir($subPath)){
$this->deleteEmptyDir($subPath);
}
$flag = false;
}
closedir($handle);
if($flag){
if(rmdir($path)){
return true;
}else{
return false;
}
}
}
}
/**
*递归创建目录
*@param $path string 在此目录下创建目录
*@param $destination string 创建的目标目录
*/
public function makeDir($path,$destination){
$destination = str_replace('\\','/',$destination);
//判读目录是否存在
if(!file_exists($path)){
echo '目录不存在';
return false;
}
if(is_dir($path)){
$handle = opendir($path);
$dirs = explode('/',$destination);
$subPath = $path . '/' . $dirs[0];
if(!file_exists($subPath)){
if(!mkdir($subPath)){
echo '目录创建失败';
return false;
}
}
if(count($dirs)>1){
$dir = implode('/',array_slice($dirs,1));
$this->makeDir($subPath,$dir);
}
closedir($handle);
return true;
}
}
/**
*剪切目录或文件
*@param $source string 源文件或目录路径
*@param $destination string 目标文件或目录路径
*/
public function moveDirToDestination($source,$destination){
//判断目录或者文件是否存在
if(!file_exists($source)||!file_exists($destination)){
echo '文件或目录不存在';
return false;
}
if(strpos($destination,$source)===0){
echo '目标目录是源目录的子目录';
return false;
}
$sourceDirs = $this->showDiretorys($source);
$sourceDir = array_keys($sourceDirs);
$sourcePrev = substr($source,0,strrpos($source,'/')+1);
$subSourceDirs = array();
foreach($sourceDir as $key=>$val){
$subSourceDirs[$key] = ltrim($val,$sourcePrev);
}
//在目标目录中创建源目录中相应的目录
foreach($subSourceDirs as $val){
$this->makeDir($destination,$val);
}
//复制文件
foreach($sourceDirs as $key=>$val){
if($val){
foreach($val as $v){
//源文件路径
$fileSourcePath = $key.'/'.$v;
//目标文件路径
$fileDestinationPath = $destination.'/'.ltrim($fileSourcePath,$sourcePrev);
copy($fileSourcePath,$fileDestinationPath);
}
}
}
//删除原目录
$this->deleteDir($source);
return true;
}
}
header('content-type:text/html;charset=utf-8');
$fileObj = new File();
$dirs = $fileObj->moveDirToDestination('./777','./000');
//$dirs = $fileObj->deleteDir('./huhu');
echo '<pre>';
var_dump($dirs);
?>