权限被拒绝 - php unlink

问题描述 投票:0回答:7

我有两个文件: b.php 和 test.txt

<?php 
$b = "test.txt";
unlink($b);
?>

错误是:警告:unlink(test.txt)[function.unlink]:权限被拒绝

为什么? b.php 和 test.txt 是 777 并且相同的组/登录

如果我在父目录上设置 777,我可以执行取消链接,但我必须设置 777 并返回到 755?

php permissions unlink
7个回答
39
投票

您(如在运行

b.php
的进程中,通过
CLI
或网络服务器)需要对文件所在目录的写访问权限。您正在更新目录内容,因此访问该文件是不够的。

请注意,如果您使用 PHP

chmod()
函数将文件或文件夹的模式设置为
777
,您应该使用
0777
来确保该数字被正确解释为八进制数。


20
投票

您首先需要使用

fclose($handle);
关闭文件,它不会删除,因为文件正在使用中。所以先关闭文件然后再尝试。


10
投票

除了其他朋友的所有答案之外,如果正在寻找这篇文章的人正在寻找删除“文件夹”而不是“文件”的方法,应该注意文件夹必须通过php rmdir( ) 函数,如果您想通过

unlink()
删除“文件夹”,您将遇到错误的警告消息,显示“权限被拒绝”

但是您可以通过

mkdir()
创建文件夹和文件,但是删除文件夹(
rmdir()
)的方式与删除文件的方式不同(
unlink()

最终成为事实:

在许多编程语言中,任何与权限相关的错误可能不会 直接意味着实际的权限问题

例如,如果您想要

readSync
一个不存在的文件
node fs module
,您将遇到错误的
EPERM
错误


2
投票
// Path relative to where the php file is or absolute server path
chdir($FilePath); // Comment this out if you are on the same folder
chown($FileName,465); //Insert an Invalid UserId to set to Nobody Owner; for instance 465
$do = unlink($FileName);

if($do=="1"){ 
    echo "The file was deleted successfully."; 
} else { echo "There was an error trying to delete the file."; } 

试试这个。希望有帮助。


1
投票

文件权限没问题(0777),但我认为您在共享服务器上,因此要正确删除您的文件; 1.创建正确的文件路径

// delete from folder
$filename = 'test.txt';
$ifile = '/newy/made/link/uploads/'. $filename; // this is the actual path to the file you want to delete.
unlink($_SERVER['DOCUMENT_ROOT'] .$ifile); // use server document root
// your file will be removed from the folder

这段小代码将发挥神奇作用,并从任何文件夹中删除您想要的任何选定文件,前提是实际文件路径是收集的。


0
投票

在 Windows 和 PHP 7.3.0 版本之前,请在取消链接之前检查您的文件是否已关闭,
正如https://www.php.net/manual/en/function.unlink.php中所述:

在 Windows 上,现在可以使用正在使用的句柄 unlink() 文件,而以前会失败。但是,在关闭该文件的所有句柄之前,仍然无法重新创建未链接的文件。

举个例子:

$fullFilePath = 'C:\Users\MyUserName\www\myApp\public\test.txt';
$handle = fopen($fullFilePath , 'w+');

fopen($filePath, 'w+');
fputs($handle, 'Some text in the file');
fclose($handle);

unlink(realpath($insertedLinesFilePath));

0
投票

这是对其他答案的一个小补充。 如果您的取消链接仍然失败,则可能是该文件具有对其的打开引用。理想情况下,您想要调查您的代码,找到该引用并正确关闭它。但如果出于某种原因你不能这样做,你可以在取消链接之前使用

gc_collect_cycles()
,它应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.