rmdir()具有特定文件名的bug?没有权限

时间:2011-01-25 18:56:07

标签: php directory permission-denied rmdir

首先,让我们解决这些问题:

  • 目录中没有打开的句柄。
  • 目录中没有文件。
  • chmod对0777的权限不会阻止错误。
  • 目录名称是正确的。

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

  

rmdir(098f6bcd4621d373cade4e832627b4f6)[function.rmdir]:第124行路径\ 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

1 个答案:

答案 0 :(得分:2)

为了能够删除文件:

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

<强>更新 关于限制删除标记 - 来自man chmod

  

受限制的删除标记或粘贴位

     

限制删除标记或粘贴   bit是单个位,其位   解释取决于文件   类型。对于目录,它会阻止   不受欢迎的用户删除   或重命名目录中的文件   除非他们拥有该文件或   目录;这被称为   限制删除标志   目录,常见于   世界可写的目录,如/ tmp。   对于一些较旧的常规文件   系统,该位保存程序   交换设备上的文本图像所以它   运行时加载速度会更快;这个   被称为粘性位。

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

chmod 1xxx dirname

更新2:

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

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

chmod('./',0777);