PHP虽然提供了 filesize、copy、unlink 等文件操作的函数,但是没有提供 dirsize、copydir、rmdirs 等文件夹操作的函数(rmdir也只能删除空目录)。所以只能手动编写这些函数,主要的技巧是通过递归将问题逐层分解,直到分解成可以直接解决的最小子问题。

====================查看文件夹大小=====================

由于文件夹是没有大小的,平常所说的文件夹尺寸准确的说应该是文件夹中所有文件的总大小。所以只需要将文件夹逐层查找,统计每一层所包含的文件大小,最后将结果从最深的文件夹返回合并。

/**
* 文件夹大小
* @param $path
* @return int
*/
function dirsize($path)
{
$size = 0;
$handle = opendir($path);
while (($item = readdir($handle)) !== false) {
if ($item == '.' || $item == '..') continue;
$_path = $path . '/' . $item;
if (is_file($_path)) $size += filesize($_path);
if (is_dir($_path)) $size += dirsize($_path);
}
closedir($handle);
return $size;
}

=====================复制文件夹======================

文件是可以复制的,文件夹是不能复制的(但可以创建),如果要达到复制文件夹的效果,就需要生成一个和原始文件夹相同目录结构的新文件夹,然后将文件按照原目录结构复制到新文件夹。按照递归的思想,不用一开始就生成完整的目录结构,只需要遍历当前目录,发现文件夹不存在再创建即可,然后再将文件复制到对应的文件夹。

/**
* 复制文件夹
* @param $source
* @param $dest
*/
function copydir($source, $dest)
{
if (!file_exists($dest)) mkdir($dest);
$handle = opendir($source);
while (($item = readdir($handle)) !== false) {
if ($item == '.' || $item == '..') continue;
$_source = $source . '/' . $item;
$_dest = $dest . '/' . $item;
if (is_file($_source)) copy($_source, $_dest);
if (is_dir($_source)) copydir($_source, $_dest);
}
closedir($handle);
}

=====================删除文件夹======================

rmdir 只能删除空文件夹,而 unlink 可以删除文件。于是删除文件夹的思路就有了,先通过 unlink 删除目录下的所有文件,再通过 rmdir 删除剩下的空文件夹。使用递归处理的逻辑是,找到当前目录下所有文件和文件夹,删除其中的所有文件,再遍历下一层目录删除所有文件……直至最后一层目录,此时整个文件夹已经没有文件了(但是文件夹还在),此时递归开始返回,每向上返回一层就删除这一层的所有空目录,当返回到最顶层的时候,递归就结束了,同时所有的文件和目录也都删除了。

/**
* 删除文件夹
* @param $path
* @return bool
*/
function rmdirs($path)
{
$handle = opendir($path);
while (($item = readdir($handle)) !== false) {
if ($item == '.' || $item == '..') continue;
$_path = $path . '/' . $item;
if (is_file($_path)) unlink($_path);
if (is_dir($_path)) rmdirs($_path);
}
closedir($handle);
return rmdir($path);
}

=====================剪切文件夹======================

rename 是 PHP Filesystem 函数中的一个特例,它既可以重命名文件,也可以重命名文件夹。如果你为重命名文件传入不同的路径,它又成了剪切函数,堪称文件函数中小而美的典范。

/**
* @param $oldname 必需。规定要重命名的文件或目录。
* @param $newname 必需。规定文件或目录的新名称。
* @param $context 可选。规定文件句柄的环境。
*/
rename($oldname,$newname,$context);

PHP 文件夹操作「复制、删除、查看大小」递归实现的更多相关文章

  1. PHP 文件夹操作「复制、删除、查看大小、重命名」递归实现

    PHP虽然提供了 filesize.copy.unlink 等文件操作的函数,但是没有提供 dirsize.copydir.rmdirs 等文件夹操作的函数(rmdir也只能删除空目录).所以只能手动 ...

  2. PHP 文件夹操作「复制、删除、查看大小」迭代实现

    "既然递归能很好的解决,为什么还要用迭代呢"?主要的原因还是效率问题-- 递归的概念是函数调用自身,把一个复杂的问题分解成与其相似的多个子问题来解决,可以极大的减少代码量,使得程序 ...

  3. Linux常用命令,查看树形结构、删除目录(文件夹)、创建文件、删除文件或目录、复制文件或目录(文件夹)、移动、查看文件内容、权限操作

    5.查看树结构(tree) 通常情况下系统未安装该命令,需要yum install -y tree安装 直接使⽤tree显示深度太多,⼀般会使⽤ -L选项⼿⼯设定⽬录深度 格式:tree -L n [ ...

  4. c# 封装的文件夹操作类之复制文件夹

    c#  封装的文件夹操作类之复制文件夹 一.复制文件夹原理: 1.递归遍历文件夹 2.复制文件 二.FolderHelper.cs /// <summary> /// 文件夹操作类 /// ...

  5. Java 代码完成删除文件、文件夹操作

    import java.io.File;/** * 删除文件和目录 * */public class DeleteFileUtil {    /**     * 删除文件,可以是文件或文件夹     ...

  6. FILE文件删除操作(删除指定文件夹下所有文件和文件夹包括子文件夹下所有文件和文件夹),就是删除所有

    2018-11-05  19:42:08开始写 选择 删除 1.FileUtils.java类 import java.io.File;//导入包 import java.util.List;//导入 ...

  7. R语言进行文件夹操作示例(转)

    rm(list=ls())path = 'J:/lab/EX29 --在R语言中进行文件(夹)操作'setwd(path)cat("file A\n", file="A& ...

  8. Python_文件与文件夹操作

    ''' os模块除了提供使用操作系统功能和访问文件系统的简便方法之外,还提供了大量文件与文件夹操作的方法. os.path模块提供了大量用于路径判断.切分.连接以及文件夹遍历的方法. shutil模块 ...

  9. centos文件/文件夹操作-检查磁盘、内存、cpu使用情况-vi操作命令

    Part1:CentOS文件/文件夹操作 1.新建文件夹 即创建目录 mkdir 文件名 新建一个名为test的文件夹在home下 vi source1 mkdir /home/test 注意:当创建 ...

随机推荐

  1. lombok在IntelliJ IDEA下的使用

    lombok是一款可以精减java代码.提升开发人员生产效率的辅助工具,利用注解在编译期自动生成setter/getter/toString()/constructor之类的代码.代码越少,意味着出b ...

  2. Javascript的this用法及jQuery中$this和$(this)的区别

    this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 1.this就是全 ...

  3. 5G承载为什么需要三层到边缘

  4. Android 提醒公共方法 Notification

    SimpAndroidFarme是近期脑子突然发热想做的android快速开发的框架,目标是模块化 常用的控件,方便新手学习和使用.也欢迎老鸟来一起充实项目:项目地址 今天的目标是做一个公共的提醒方法 ...

  5. jQuery的页面载入

    jQuery 页面载入 $(document).ready(function(){ //程序段 }) 原生javaScript window.onload = function(){ //程序段 } ...

  6. C#-WebForm-Request、Response、QueryString、Repeater删

    知识点: Request - 获取请求对象 专门用来接传递过来的值 Request["key"](李献策lxc) 1.获取地址栏传递过来的值 get 2.获取表单传递过来的参数值 ...

  7. 逻辑回归 Logistic Regression

    逻辑回归(Logistic Regression)是广义线性回归的一种.逻辑回归是用来做分类任务的常用算法.分类任务的目标是找一个函数,把观测值匹配到相关的类和标签上.比如一个人有没有病,又因为噪声的 ...

  8. css挤带边框的三角

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  9. java 中正则表达式匹配

    String str = "#a#,#b#"; String reg="\\#+[^\\#]+\\#+"; Pattern p=Pattern.compile( ...

  10. JSP和Servlet的中文乱码处理

    JSP和Servlet的中文乱码处理 前几天学习了JSP和Servlet中有关中文乱码的一些问题,写成了博客,今天进行更新一下.应该是可以解决日常的乱码问题了.现在作以下总结希望对需要的人有所帮助.我 ...