PHP:即使文件存在且可写,unlink也无法删除文件

7

我一直在试图弄清楚为什么unlink不起作用。我尝试查看之前的stackoverflow问题和答案,但没有成功。需要删除的确切文件名是'upload/test.png'。 首先,我检查文件是否存在。

$filename = 'upload/test.png';
if(file_exists($filename)){
// file_exists returns true
    if(is_writable($filename)){
        // is_writable also returns true
        if(unlink($filename)){
            echo 'file deleted';
        }
        else{
            echo 'cant delete file';
            print_r(error_get_last());
            // this gives me
            // unlink() function.unlink: No such file or directory
        }
    }
}

在Windows上,给出文件的完整物理路径,从C:开始;在Linux上,则是从/开始。 - Sumit Gupta
realpath()和$_SERVER选项,或者完整路径也会返回错误。由于检查已经完成,我们可以假设在unlink执行之前文件已被读取,因此意味着该文件具有有效路径。 - nickanor
你是在实时服务器上工作还是在自己的电脑上?尝试使用虚拟路径 ./upload/test.png 并确保你有写入权限。 - GroovyCarrot
1
我测试了你的代码,它完美地运行了。而且,如果文件在指定位置不存在,它会显示一个空白屏幕,但不会报错。 - Vikas Arora
@GroovyCarrot is_writable 返回true。我已经尝试了虚拟路径,但仍然出现错误。 - nickanor
@vkas。当我运行脚本时,文件存在,我正在查看它。 - nickanor
4个回答

6
给出完整路径,例如
$filename = dirname(__FILE__) . '/upload/test.png';

那么请尝试这个,
if (is_file($filename)) {

   chmod($filename, 0777);

   if (unlink($filename)) {
      echo 'File deleted';
   } else {
      echo 'Cannot remove that file';
   }

} else {
  echo 'File does not exist';
}

2
如果您表示一切正常,没有权限问题,那么您也可以尝试以下方法:
unlink(realpath("upload/test.png"));

完美地为我工作!! - Satyam Saxena

0

尝试一下并发布您得到的输出(如果有)。

$filename = 'upload/test.png';

@unlink($filename);

if(is_file($filename)) {
   echo "file was locked (or permissions error)";
}

is_file函数没有返回任何值。 - nickanor
@nickanor 它返回的结果要么是“false”,要么是“true”。既然它没有返回“true”,那么那个文件就被删除了。 - Yang
文件还在这里。 - nickanor
你正在使用相对路径,不是要表现得高傲,但你确定你没有在另一个文件夹中查找吗?尝试将路径更改为绝对路径!/path/to/the/file/upload/test.png或者C:/path/to/the/file/upload/test.png - BT643

0

我发现unlink函数对编码非常敏感。我也遇到了这样的问题,但是后来我使用了:

$filename= iconv("UTF-8", "Windows-1251", $filename);

对我来说,那很有效。


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