1

首先,让我们把这些排除在外:

  • 目录上没有打开的句柄。
  • 目录中没有文件。
  • chmod获得 0777 的权限并不能防止该错误。
  • 目录名是正确的。

那么,这是我的问题。 rmdir()尝试删除目录时抛出此错误:

rmdir(098f6bcd4621d373cade4e832627b4f6) [function.rmdir]:第 124 行的 path\to\administrate.php 中的权限被拒绝

098f6bcd4621d373cade4e832627b4f6是目录的名称。

这是脚本的相关部分。

if(is_dir($userhash)) :
foreach (new DirectoryIterator($userhash) as $fileInfo) {
    $fileName = $fileInfo->getFilename();
    if($fileInfo->isDot()) continue;

    if(!rename($userhash.'/'.$fileName , 'trashcan/'.$username.'/'.$fileName)) {
        echo '<p class="error">Could not move '.$fileName.'</p>';
        $err = 1;
    }
}
else :
    echo '<p class="error">Unable to delete files! error: 67</p>';
    $err = 1;
endif;

    //JUST TO BE SURE
    chmod('./',0777);
    chmod($userhash,0777);

// RMDIR ONCE THE DIR IS EMPTY.
if(rmdir($userhash))
    echo '<p class="success">Deleted the user directory. The files are in the trash.</p>';
else {
    echo '<p class="error">Could not remove the user directory. Error: 656</p>';
    $err = 1;
}

更新

'jake'我在同一目录中手动创建了目录。我做到了rmdir('jake');,而且效果很好。现在,我在同一目录中手动创建了'098f6bcd4621d373cade4e832627b4f6'一个目录。我做了rmdir('098f6bcd4621d373cade4e832627b4f6');,它出错了!

更新 2

这开始看起来像一些奇怪rmdir()的错误,看起来不太可能。这是我创建的目录名称,然后尝试使用rmdir;删除

098f6bcd4621d373cade4e832627b4f6        |  didn't work (quintuple checked)
098f6bcd4621d373cade4e832627b4f7        |  worked
098f6bcd4621d373cade4e832627b4f         |  worked
098f6bcd4621d373cade4e832627b4f66       |  worked
4

1 回答 1

2

为了能够删除文件:

  • 用户应具有对 PARENT 目录的写入权限
  • 不应为 PARENT 目录设置限制删除标志

更新: 关于限制删除标志 - 来自man chmod

限制删除标志或粘滞位

限制删除标志或粘滞位是单个位,其解释取决于文件类型。对于目录,它阻止非特权用户删除或重命名目录中的文件,除非他们拥有该文件或目录;这称为目录的受限删除标志,通常在 /tmp 等全局可写目录中找到。对于某些旧系统上的常规文件,该位将程序的文本图像保存在交换设备上,以便在运行时更快地加载;这称为粘性位。

您可以通过将模式中的第一个八进制数字加 1 来设置它,例如:

chmod 1xxx dirname

更新 2:

执行 php 的用户是否具有 chmod 父目录的权限?

换句话说,您确定第一个 chmod 调用返回 true 吗?

chmod('./',0777);
于 2011-01-25T18:59:15.227 回答