<?php echo "<pre>"; //定义想要删除视频的目录 $path = str_replace('\', '/', 'F:programutorrent2.02downloads'); //更改工作路径 chdir($path); /**function name:del; *@param path, delete root directory; *@param depth, (递归深度) */ function del($path,$depth = 0){ //打开目录,获得文件句柄 $dir_handle = opendir($path); //开始遍历 while (false !== $file = readdir($dir_handle)) { //忽略‘.’跟‘..’ if ($file == '.' || $file == '..') { continue; } //判断当前文件是否为一个目录,是则递归 if (is_dir($path.'/'.$file)) { del($path.'/'.$file,$depth + 1); }else{ //不是一个文件则判断是否为视频 if (strstr($file,'.itcast') || strstr($file,'.avi') || strstr($file,'.mp4')) { //转换绝对路径字符编码(不含文件名) @$path = iconv('utf-8','gbk',$path); //拼凑出文件完整的绝对路径 $video = $path.'/'.$file; //删除 @unlink($video); } } //判断是否为视频文件夹 if($file == 'video' || $file == 'vedio'){ //是则删除 @rmdir($path.'/'.$file); } //输出文件名 echo str_repeat('-', $depth * 5),$file,"<br />"; } } //调用函数 del($path);
前两天看着F盘快要爆盘了,就想着把它清理一下,把传智的视频都删掉,忽然想起来我学过的递归遍历目录,还有删除文件和文件夹,那么我也可以试一下递归删除视频啊~
好,想到就马上行动,我首先把递归遍历目录的函数写了出来,然后因为怕发生一些不可预料的错误,就另外写一个小脚本尝试单独的删除一个视频,但由于视频名称是中文的,不能删,我到网上查资料,发现需要用到一个编码转换函数iconv(),然后就成功了。之后我在递归函数里面删除,发现系统分别爆了两个错误,说我iconv()和unlink()都使用不正确。我调试了好多次都不行。到了今天晚上,我询问了辅导员,原来出错的原因是我先把文件的路径先拼凑好再去转换编码,但由于目录(utf-8)和中文文件名(gbk)使用的编码不一样,所以iconv()转换不成功。最后的解决方案就是先把目录转换为gbk,再和中文文件名拼凑一起,就可以了。
然后我想起了一句话:伟大的程序员都懒惰。