PHP删除文件脚本

时间:2011-01-30 17:36:18

标签: php

我有一个基本的PHP脚本,显示目录的文件内容。这是脚本:

<?php

$Dept = "deptTemplate";

if(isset($_REQUEST['dir'])) {  
    $current_dir = $_REQUEST['dir'];  
} else {
    $current_dir = 'docs';
}

if ($handle = opendir($current_dir)) {  
     while (false !== ($file_or_dir = readdir($handle))) {  
        if(in_array($file_or_dir, array('.', '..'))) continue;  
        $path = $current_dir.'/'.$file_or_dir;  
        if(is_file($path)) {  
            echo '`<a href="/Implementation/'.$Dept.'/'.$path.'">'.$file_or_dir.'</a> - [Delete button/link]<br/>`';  
        } else {  
            echo '`<a href="testFolderiFrame.php?dir='.$path.'">`'.$file_or_dir."\n`</a>` - [Delete button/link]`<br/>`";  
        }
    }
    closedir($handle);  
}
?> 

我正在尝试创建一个显示在每个文件旁边的删除链接/按钮,单击此按钮时,相应的文件将被删除。你知道怎么做吗?

4 个答案:

答案 0 :(得分:6)

使用内置的unlink($filepath)功能。

答案 1 :(得分:1)

当然,您必须使用unlink()rmdir(),并且您需要一个递归目录删除功能,因为rmdir()不适用于包含文件的目录。您还需要确保删除脚本非常安全,以阻止人们删除所有内容。

递归函数的类似内容:

function Remove_Dir($dir)
{
     $error = array();
     if(is_dir($dir))
     {
          $files = scandir($dir);  //scandir() returns an array of all files/directories in the directory
          foreach($files as $file)
          {
               $fullpath = $dir . "/" . $file;
               if($file == '..' || $file == '.')  
               {
                   continue;  //Skip if ".." or "."
               }
               elseif(is_dir($fullpath))
               {
                   Remove_Dir($fullpath); //recursively remove nested directories if directory
               }
               elseif(is_file($fullpath))
               {
                   unlink($fullpath); //Delete file otherwise
               }
               else
               {
                   $error[] = 'Error on ' . $fullpath . '.  Not Directory or File.'  //Should be impossible error, because everything in a directory should be a file or directory, or . or .., and thus should be covered.
               }
           }

           $files = scandir($dir);  //Check directory again
           if(count($files) > 2) //if $files contains more than . and ..
           {
                Remove_Dir($dir);
           }
           else
           {
                rmdir($dir); //Remove directory once all files/directories are removed from within it.
           }
           if(count($error) != 0)
           {return $error;}
           else
           {return true;}
     }
}

然后你只需要通过GET或者某些东西将要删除的文件或目录传递给脚本,可能需要urlencode()或其他东西,确保它是具有删除权限的授权用户试图删除这些东西,unlink()如果它是一个文件,Remove_Dir()如果它是一个目录。

在删除目录/文件之前,您必须将目录或文件的完整路径添加到脚本中的目录/文件中。

您需要安全性的一些事情首先要确保删除发生在它应该发生的地方,这样有人就无法执行?dir=/或某事并试图从root用户删除整个文件系统可以通过使用类似$dir = '/home/user/public_html/directories/' . $_GET['dir'];之类的方法将适当的路径添加到输入上来规避这一点,当然它们可能会删除该路径中的所有内容,这意味着您需要确保用户有权执行此操作如此。

为了以防万一,需要定期备份文件。

答案 2 :(得分:0)

这样的东西?未经测试......

<?php

   echo '`<a href="/Implementation/'.$Dept.'/'.$path.'">'.$file_or_dir.'</a> - [<a href=\"?thispage&del=1&file_or_dir=$file_or_dir\">Delete button/link</a>]<br/>`';  

?>

<?php

   if ($_GET['del'] == 1 && isset($_GET['file_or_dir']){
      unlink ("path/".$_GET['file_or_dir']);
   }

?>

答案 3 :(得分:0)

我已经解决了这个问题:

我在原始脚本中的每个列出文件的末尾添加了此删除链接:

- < a href="delete.php?file='.$file_or_dir.'&dir=' . $dir . '"> Delete< /a>< br/>';

此链接将我带到下载脚本页面,如下所示:

<?php
ob_start();

$file = $_GET["file"];

$getDir = $_GET["dir"];

$dir = 'docs/' . $getDir . '';

$isFile = ($dir == "") ? 'docs/' . $file . '' : '' . $dir . '/' . $file . '';

if (is_file($isFile)){
if ($dir == "")
    unlink('docs/' . $file . '');
else
    unlink('' . $dir . '/' . $file . '');

echo '' . $file . ' deleted';
echo ' from ' . $dir . '';
}
else{
    rmdir('' . $dir . '/' . $file . '');
    echo '' . $dir . '/' . $file . ' deleted';}

header("Location: indexer.php?p=" . $getDir . "");
ob_flush();

?>

现在一切都很出色,谢谢大家的帮助和建议:)