在PHP中删除一个目录中的单个文件

14

我从这个链接获得了PHP列出目录脚本:

http://www.gaijin.at/en/scrphpfilelist.php

如何从目录中删除单个文件?我尝试过unlink,但它删除了该目录中的所有文件。下面是我从链接中得到的简短代码!

while ($file = readdir ($hDir)) {
if ( ($file != '.') && ($file != '..') && (substr($file, 0, 1) != '.') &&
     (strtolower($file) != strtolower(substr($DescFile, -(strlen($file))))) &&
     (!IsFileExcluded($Directory.'/'.$file))
   ) {

  array_push($FilesArray, array('FileName' => $file,
                                'IsDir' => is_dir($Directory.'/'.$file),
                                'FileSize' => filesize($Directory.'/'.$file),
                                'FileTime' => filemtime($Directory.'/'.$file)
                                ));
}
}
$BaseDir = '../_cron/backup';
$Directory = $BaseDir;

foreach($FilesArray as $file) {
  $FileLink = $Directory.'/'.$file['FileName'];
  if ($OpenFileInNewTab) $LinkTarget = ' target="_blank"'; else $LinkTarget = '';
    echo '<a href="'.$FileLink.'">'.$FileName.'</a>';
    echo '<a href="'.unlink($FileLink).'"><img src="images/icons/delete.gif"></a></td>';
  }
}

在调用列出目录文件夹的函数时:backup。
unlink($FileLink) 中,当我将鼠标悬停在链接上时,链接是否已更改为另一个文件夹到管理文件夹?


你能发一下你尝试过的代码吗? - Harold
你在循环中使用了unlink函数,因此循环内的所有内容都被删除了。 - S L
@experimentX 你有什么办法可以在不删除所有文件的情况下放置 unlink 吗? - tonoslfx
是的...我会在5分钟内看到更新。 - S L
8个回答

35

unlink('path_to_filename');会删除一个文件。

如果你的整个目录文件都消失了,这意味着你列出了所有文件并在循环中逐个删除。

你不能在同一页上删除。您必须使用其他页面。创建一个名为deletepage.php的页面,其中包含删除脚本,并将其链接到具有“file”参数的页面。

foreach($FilesArray as $file)
{
    $FileLink = $Directory.'/'.$file['FileName'];

    if($OpenFileInNewTab) $LinkTarget = ' target="_blank"'; 
    else $LinkTarget = '';

    echo '<a href="'.$FileLink.'">'.$FileName.'</a>';
    echo '<a href="deletepage.php?file='.$fileName.'"><img src="images/icons/delete.gif"></a></td>';        
}

在deletepage.php页面上

//and also consider to check if the file exists as with the other guy suggested.
$filename = $_GET['file']; //get the filename
unlink('DIRNAME'.DIRECTORY_SEPARATOR.$filename); //delete it
header('location: backto prev'); //redirect back to the other page

如果您不想进行导航,则可以使用Ajax使其更加优雅。


1
你已经创造了一个巨大的安全漏洞。如果他们只是玩弄“文件”参数,人们可以删除任何他们想要的东西。 - middus
我知道这个答案可能有点老了,但这是被接受的答案,而且不应该... 你应该始终检查文件是否存在,并且如果它是一个文件而不是目录,最好还要检查要删除的文件类型。 - Mooncake

13

4

只需要简单操作,您就能使用它。

    $sql="select * from tbl_publication where id='5'";
    $result=mysql_query($sql);
    $res=mysql_fetch_array($result);
    //Getting File Name From DB
    $pdfname = $res1['pdfname'];
    //pdf is directory where file exist
    unlink("pdf/".$pdfname);

为什么在你的回答中引入了数据库查询? - Nico Haase
@NicoHaase 这只是获取资源的简单示例。最终会有删除代码,获取文件只是源代码。不希望收到负面评价! - Surendra Jnawali

3
您下载的脚本列出了指定文件夹的内容。您可能在列出文件的while循环中放置了unlink - 调用。
编辑 - 现在您发布了您的代码:
echo '<a href="'.unlink($FileLink).'"><img src="images/icons/delete.gif"></a></td>';

每次写入该行时,都会调用unlink函数来删除您的文件。您需要编写一个包含删除函数的脚本链接,并传递一些参数告诉您的脚本要删除什么。

例如:

<a href="/path/to/script.php?delete='. $FileLink .'">delete</a>

您不应该将文件路径传递给此脚本并仅删除它,因为恶意实体可能会使用它来删除所有内容或执行其他恶意操作。


3

unlink 是适用于您的用例的正确 PHP 函数。

unlink('/path/to/file');

没有更多的信息,我无法告诉你在使用它时出了什么问题。

1

如果你想删除单个文件,就像你发现的那样,你必须使用unlink()函数。

该函数将删除您传递给它的参数:所以,你需要传递给它要删除的文件的路径


例如,你可以这样使用:

unlink('/path/to/dir/filename');

0
<?php 
    if(isset($_GET['delete'])){
        $delurl=$_GET['delete'];
        unlink($delurl);
    }
?>

<?php
if ($handle = opendir('.')) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry != "." && $entry != "..") {
            echo "<a href=\"$entry\">$entry</a> | <a href=\"?delete=$entry\">Delete</a><br>";
        }
    }
    closedir($handle);
}
?>

这就是它


0
// This code was tested by me (Helio Barbosa)

    // this directory (../backup) is for try only.
    // it is necessary create it and put files into him.

    $hDir = '../backup';
    if ($handle = opendir( $hDir )) {
        echo "Manipulador de diretório: $handle\n";
        echo "Arquivos:\n";

        /* Esta é a forma correta de varrer o diretório */
        /* Here is the correct form to do find files into the directory */
        while (false !== ($file = readdir($handle))) {
            // echo($file . "</br>");
            $filepath = $hDir . "/" . $file ;
            // echo( $filepath . "</br>" );
            if(is_file($filepath))
            {
                echo("Deleting:" . $file . "</br>");
                unlink($filepath);
            }           
        }

        closedir($handle);
    }

你好,欢迎来到SO。也许你可以添加一份英文说明,以便其他人能够理解你的代码? - Fabio Mendes Soares

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接