改变' 0777'字符串到0777八进制文件

时间:2015-02-23 10:54:35

标签: php permissions chmod octal

我的代码就像

$perm = "0777"; //this is fetch from the database
chmod("myFolder/", $perm);

但$ perm的值不是八进制,我怎样才能将变量的数据类型更改为八进制?甚至一种替代方法都可以做到

4 个答案:

答案 0 :(得分:7)

如上所述,没有八进制数字类型。并且chmod函数接收第二个参数作为整数。 $perm的隐式转换并不假设该数字是八进制的。因此,您需要使用适当的函数将“八进制字符串”转换为整数。

只需使用octdec功能

即可
$perm = "0777"; //this is fetch from the database
chmod("myFolder/", octdec($perm));

intval

chmod("myFolder/", intval($perm, 8));

P.S。

var_dump('0644' == 0644);             // bool(false)
var_dump(intval('0644') == 0644);     // bool(false)
var_dump(decoct('0644') == 0644);     // bool(false)

var_dump(octdec('0644') == 0644);     // bool(true)
var_dump(intval('0644', 8) == 0644);  // bool(true)

答案 1 :(得分:1)

似乎没有什么对我有用,所以我只是创建了一个非常愚蠢的解决方案,我只想在这里发布。

function permtooct($permissions) {      

    $mode = 0; 
    if ($permissions[0] == '1') $mode += 01000; 
    if ($permissions[0] == '2') $mode += 02000; 
    if ($permissions[0] == '3') $mode += 03000; 
    if ($permissions[0] == '4') $mode += 04000; 
    if ($permissions[0] == '5') $mode += 05000; 
    if ($permissions[0] == '6') $mode += 06000; 
    if ($permissions[0] == '7') $mode += 07000; 

    if ($permissions[1] == '1') $mode += 0100; 
    if ($permissions[1] == '2') $mode += 0200; 
    if ($permissions[1] == '3') $mode += 0300; 
    if ($permissions[1] == '4') $mode += 0400; 
    if ($permissions[1] == '5') $mode += 0500; 
    if ($permissions[1] == '6') $mode += 0600; 
    if ($permissions[1] == '7') $mode += 0700; 

    if ($permissions[2] == '1') $mode += 010; 
    if ($permissions[2] == '2') $mode += 020; 
    if ($permissions[2] == '3') $mode += 030; 
    if ($permissions[2] == '4') $mode += 040; 
    if ($permissions[2] == '5') $mode += 050; 
    if ($permissions[2] == '6') $mode += 060; 
    if ($permissions[2] == '7') $mode += 070; 

    if ($permissions[3] == '1') $mode += 01; 
    if ($permissions[3] == '2') $mode += 02; 
    if ($permissions[3] == '3') $mode += 03; 
    if ($permissions[3] == '4') $mode += 04; 
    if ($permissions[3] == '5') $mode += 05; 
    if ($permissions[3] == '6') $mode += 06; 
    if ($permissions[3] == '7') $mode += 07; 

    return($mode);
}
$a = "0777";
chmod("myFolder/", permtooct($a));

答案 2 :(得分:0)

Octal不是一种类型。整数是类型。

您希望将字符串转换为int,因此字符串以零开头,它将是一个八进制整数。

使用intval

chmod('myFolder/', intval($perm));

答案 3 :(得分:0)

我需要将chmod()的模式组件作为函数内的变量提供。我花了足够的时间尝试(并且失败)将字符串转换为八进制,同时保持0777值。最后,我决定放弃chmod() / ftp_chmod(),并选择ftp_site(),它不会阻塞字符串类型的模式代码。

if(!ftp_site($connection,"chmod {$mode} {$path}/{$file}")){
    // handle the error
}

这对我有用。如果这在某种程度上是有缺陷的或不是最佳做法,请解释。

编辑:有些读者可能会拒绝这个ftp_解决方案作为作弊,因为它不是文件系统功能解决方案。这对我来说不是问题,因为我在ftp类中编写了一个函数。