【问题标题】:mkdir ignore mode, but use recursive parametermkdir 忽略模式,但使用递归参数
【发布时间】:2011-03-19 10:54:26
【问题描述】:

PHP 的mkdir 函数具有以下签名:

bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] )

我想调用这个函数,指定$pathname$recursive 设置为true,但我不想指定$mode 参数。我们在服务器级别控制新文件/目录的权限,因此不希望在我的代码中指定它们。

那么我应该传递什么$mode 以便它被有效地忽略并且不会发生chmod-ing?我还没找到办法。

也许唯一的解决方案是编写一个自定义的mkdir 函数,该函数将打破路径并逐个创建目录?

【问题讨论】:

    标签: php permissions mkdir


    【解决方案1】:

    为什么不将模式设置为默认值0777。

    【讨论】:

    • 我不希望将我的文件/目录设置为 0777
    • 哦,没关系,这似乎使用了服务器设置的默认权限。忘了umask。干杯!
    【解决方案2】:

    0777?

    除非我遗漏了什么,否则签名会显示三个可选参数。前两个 $mode$recursive 在未指定时分别具有默认值 0777false。明确指定它不应改变行为。

    【讨论】:

    • 我想今天两杯咖啡不足以让我醒来 :) 可惜我不能接受 3 个答案。干杯!
    【解决方案3】:

    0777 是默认值。如果您不指定参数,则将使用0777 代替,因此任何试图“绕过”指定它的尝试都是没有意义的。

    我认为你根本不会解决这个问题,因为这不是 PHP 的行为:GNU/Linux 的 mkdir() 做同样的事情:

    参数mode指定使用的权限。它由进程的umask以通常的方式修改:创建目录的权限为(mode & ~umask & 0777)。

    我不确定这是否是您需要担心的事情。如果是,我认为你能做的最好的事情就是检查父目录的权限并应用它。

    【讨论】:

    • 我想今天两杯咖啡不足以让我醒来:) 可惜我不能接受 3 个答案。干杯!
    【解决方案4】:

    对不起,如果你想给 $recursive 参数,没有办法逃避 $mode 参数。

    您可以将模式存储在一个变量中,然后在任何地方使用它-

    $mode = 0777;
    
    mkdir($file_name, $mode, $recursive);
    

    【讨论】:

      猜你喜欢
      • 2014-11-04
      • 1970-01-01
      • 2012-09-20
      • 2018-09-08
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 2021-12-04
      • 2011-01-04
      相关资源
      最近更新 更多