温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何在PHP中使用迭代对文件夹进行复制、删除等操作

发布时间:2021-02-05 16:25:49 来源:亿速云 阅读:200 作者:Leah 栏目:开发技术

这期内容当中小编将会给大家带来有关如何在PHP中使用迭代对文件夹进行复制、删除等操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

查看文件夹大小

迭代的思路是让计算机对一组指令进行重复执行,在每次执行这组指令时,都从变量的原值推出其它的新值……重复这一过程直到达到结束条件或没有新值产生。

由于递归相当于循环加堆栈,所以可以在迭代中使用堆栈来进行递归和迭代的转换。

/**  * 文件夹大小  * @param $path  * @return int  */ function dirsize($path) {   /* 初始条件 */   $size = 0;   $stack = array();   if (file_exists($path)) {     $path = realpath($path) . '/';     array_push($stack, '');   } else {     return -1;   }   /* 迭代条件 */   while (count($stack) !== 0) {     $dir = array_pop($stack);     $handle = opendir($path . $dir);     /* 执行过程 */     while (($item = readdir($handle)) !== false) {       if ($item == '.' || $item == '..') continue;       $_path = $path . $dir . $item;       if (is_file($_path)) $size += filesize($_path);       /* 更新条件 */       if (is_dir($_path)) array_push($stack, $dir . $item . '/');     }     closedir($handle);   }   return $size; }

复制文件夹

迭代和递归都具有初始化变量、判断结束条件、执行实际操作、产生新变量这四个步骤,只不过所在的位置不同罢了。

比如初始化变量这一步骤,在迭代中是位于函数的开始部分,而在递归中是指其他函数传递参数这一过程;

判断结束条件这一步骤,在迭代中用于判断循环是否继续,在递归中用于判断递归的结束位置;

执行实际操作在递归和迭代中都是函数的核心部分,位于产生新变量步骤之前;

产生新变量在迭代中是迭代继续的条件,在递归中是下一次递归的基础,由于产生了新变量才使得递归或迭代继续进行。

/**  * 复制文件夹  * @param $source  * @param $dest  * @return string  */ function copydir($source, $dest) {   /* 初始条件 */   $stack = array();   $target = '';   if (file_exists($source)) {     if (!file_exists($dest)) mkdir($dest);     $source = realpath($source) . '/';     $dest = realpath($dest) . '/';     $target = realpath($dest);     array_push($stack, '');   }   /* 迭代条件 */   while (count($stack) !== 0) {     $dir = array_pop($stack);     $handle = opendir($source . $dir);     if (!file_exists($dest . $dir)) mkdir($dest . $dir);     /* 执行过程 */     while (($item = readdir($handle)) !== false) {       if ($item == '.' || $item == '..') continue;       $_source = $source . $dir . $item;       $_dest = $dest . $dir . $item;       if (is_file($_source)) copy($_source, $_dest);       /* 更新条件 */       if (is_dir($_source)) array_push($stack, $dir . $item . '/');     }     closedir($handle);   }   return $target; }

删除文件夹

抛开语言特性影响性能最多的就是冗余代码了,冗余代码通常是由于设计不到位而产生的。

多数情况下递归要比迭代冗余代码更多,这也是造成递归效率低的一大因素。

但当递归代码足够简练,冗余度足够低时,迭代的性能未必就比递归高。

比如这个用迭代实现的文件夹删除函数,速度就比递归要慢20%,主要原因是空文件夹的判断,在递归中当文件夹没有子文件夹时,函数会直接删除所有文件和当前文件夹,递归结束。

在迭代中即使文件夹为空也需要将其存入堆栈,下次迭代时再判断是否为空,之后才能删除。这就相比递归多了判断文件为空、存入堆栈、取出迭代等冗余操作,所以处理速度会比递归更慢。

/**  * 删除文件夹  * @param $path  * @return bool  */ function rmdirs($path) {   /* 初始化条件 */   $stack = array();   if (!file_exists($path)) return false;   $path = realpath($path) . '/';   array_push($stack, '');   /* 迭代条件 */   while (count($stack) !== 0) {     $dir = end($stack);     $items = scandir($path . $dir);     /* 执行过程 */     if (count($items) === 2) {       rmdir($path . $dir);       array_pop($stack);       continue;     }     /* 执行过程 */     foreach ($items as $item) {       if ($item == '.' || $item == '..') continue;       $_path = $path . $dir . $item;       if (is_file($_path)) unlink($_path);       /* 更新条件 */       if (is_dir($_path)) array_push($stack, $dir . $item . '/');     }   }   return !(file_exists($path)); }

查看执行时间

这是一个查看代码执行时间(毫秒数)的函数,通过回调方式执行目标代码(或函数),最终计算出执行的时间(毫秒)。通过这个工具可以对比函数之间的性能差距,非常简单实用的一个小工具。

/**  * 函数执行毫秒数  * @param $func  * @return int  */ function exec_time($func) {   $start = explode(' ', microtime());   $func();// 执行耗时操作   $end = explode(' ', microtime());   $sec_time = floatval($end[0]) - floatval($start[0]);   $mic_time = floatval($end[1]) - floatval($start[1]);   return intval(($sec_time + $mic_time) * 1000); } echo exec_time(function () {   /* 执行的耗时操作 */ });

上述就是小编为大家分享的如何在PHP中使用迭代对文件夹进行复制、删除等操作了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI