zl程序教程

您现在的位置是:首页 >  后端

当前栏目

php实现遍历目录并删除指定文件中指定内容

PHP文件遍历 实现 删除 目录 内容 指定
2023-06-13 09:15:41 时间

现在正坐在安静的寝室里,寒假俨然已经离我而去了……今天发的是我寒假里搞的最后一次学习,之后的时间就一直在看海贼王了。

以前写过一个C语言的遍历目录+复制文件的程序,很长很复杂,现在用PHP一样可以实现遍历目录,而代码就短了不少。这个程序目的是遍历目录,找到所有指定文件名的文件,并删除其中指定的字符串。

复制代码代码如下:


<?php
 //功能:删除指定目录(包括子目录)下所有指定文件中指定字符串

 $tmpfiledir=$_SERVER["DOCUMENT_ROOT"]."tmp.txt";
 functiondel($getstr)
 {
  $isbak=true;//是否备份原文件,true为备份,false不备份
  global$tmpfiledir;
  $fr=fopen($tmpfiledir,"r")ordie("未能打开临时文件");
  while($row=fgets($fr))
  {
   if(empty($row))break;
   $row=trim($row);
   $opp=fopen($row,"r")ordie("未能打开$row");
   $str=fread($opp,filesize($row))ordie("不能读$row");
   $str=str_replace($getstr,"",$str);
   fclose($opp);
   if($isbak){
    copy($row,$row.".bak")ordie("备份文件失败");
    }
   $ref=fopen($row,"w")ordie("重新打开文件失败");
   fwrite($ref,$str)ordie("重新写入文件失败");
  }
 }
 
 functiontraverse($path){
   global$name,$tmpfiledir;
  $current_dir=opendir($path);   //opendir()返回一个目录句柄,失败返回false
  if($current_dir==false)
   returnfalse;
  while(($file=readdir($current_dir))!==false){   //readdir()返回打开目录句柄中的一个条目
   $sub_dir=$path.DIRECTORY_SEPARATOR.$file;   //构建子目录路径
   if($file=="."||$file==".."){
    continue;
   }elseif(is_dir($sub_dir)){   //如果是目录,进行递归
    traverse($sub_dir);
   }else{   //如果是文件,再做比较
    $fileinfo=pathinfo($sub_dir);
    if($fileinfo["basename"]==$name)
    {
      $fopen=fopen($tmpfiledir,"a");
      fwrite($fopen,$sub_dir."\r\n");
      fclose($fopen);
     }
   }
  }
  returntrue;
 }
 
 if(isset($_POST["name"])&&isset($_POST["dir"])&&isset($_POST["str"]))
 {
   $name=$_POST["name"];
   traverse($_POST["dir"])ordie("未能创建临时文件,请检查网站根目录是否可写");
   del($_POST["str"]);
         echo"成功";
   unlink($tmpfiledir);
  }
  else
  {
    echo"<p>输入相关信息</p>";
   }
?>
<formname="input"action=""method="post">
输入目标文件夹:<inputtype="text"name="dir"/>
输入目标文件名:<inputtype="text"name="name"/>
输入需要删除的字符串:<inputtype="text"name="str"/>
<inputtype="submit"value="提交"/>
</form>

你们可以看到我写了两个函数,函数traverse将查找到的指定文件路径写在一个临时文件里,函数del删除这些文件里的指定字符串。其实我也觉得很鸡肋,直接在遍历的时候删除就可以了,根本不用生成什么临时文件。

其实我一开始是用C语言写好的遍历,因为C语言不好对文件操作所以才用php写删除的部分,所以一开始只写了一个del函数,后来干脆把遍历文件也用php写了(似乎比C简单的多),所以又写了一个函数traverse。大家只管看遍历的部分就成,也可以和我之前用C写的遍历的代码对比(我发了源代码的),看看有什么不同。

不过这个版本不支持通配符,所以文件名必须要指定。作用嘛(也是我写这个的理由),可以批量删除我们挂在服务器上的一句话木马。