代码之家  ›  专栏  ›  技术社区  ›  Drew Rich

php code mkdir('images','0777')创建一个拥有411权限的文件夹!为什么?

php
  •  6
  • Drew Rich  · 技术社区  · 16 年前

    我可以发誓这是昨天的工作。但是,现在下面的代码可以毫无问题地销毁文件夹,但会在应该是777时创建一个具有411权限的新文件夹。我的代码昨天在做这个。

    这样做的目的是压缩一个文件夹,传递它,删除图像,然后为图像创建一个新目录。

    有人能告诉我我做错了什么或者我应该做什么吗?谢谢

    function delete_directory($dirname) {
       if (is_dir($dirname))
          $dir_handle = opendir($dirname);
       if (!$dir_handle)
          return false;
       while($file = readdir($dir_handle)) {
          if ($file != "." && $file != "..") {
             if (!is_dir($dirname."/".$file))
                unlink($dirname."/".$file);
             else
                delete_directory($dirname.'/'.$file);     
          }
       }
       closedir($dir_handle);
       rmdir($dirname);
       return true;
    }
    
    $directoryToZip="jigsaw/"; // This will zip all the file(s) in this present working directory
    
    $outputDir="/"; //Replace "/" with the name of the desired output directory.
    $zipName="jigsaw.zip";
    
    include_once("createzipfile/CreateZipFile.inc.php");
    $createZipFile=new CreateZipFile;
    
    /*
    // Code to Zip a single file
    $createZipFile->addDirectory($outputDir);
    $fileContents=file_get_contents($fileToZip);
    $createZipFile->addFile($fileContents, $outputDir.$fileToZip);
    */
    
    //Code toZip a directory and all its files/subdirectories
    $createZipFile->zipDirectory($directoryToZip,$outputDir);
    
    /*
    $rand=md5(microtime().rand(0,999999));
    $zipName=$rand."_".$zipName;
    */
    $fd=fopen($zipName, "wb");
    $out=fwrite($fd,$createZipFile->getZippedfile());
    fclose($fd);
    $createZipFile->forceDownload($zipName);
    
    @unlink($zipName);
    delete_directory('jigsaw/assets/images/jigsaw_image');
    
    mkdir('jigsaw/assets/images/jigsaw_image','0777');
    
    5 回复  |  直到 10 年前
        1
  •  31
  •   Ignacio Vazquez-Abrams    16 年前

    因为你应该使用八进制文字 0777 不是字符串中的数字 "0777" ,实际上 01411 八进制。

        2
  •  6
  •   Omidoo    14 年前

    我也遇到了类似的问题,但即使删除了引号,权限也不会设置为0777。

    mkdir("infosheets/c/" , 0777);
    

    但创建的文件夹设置为0755!

    这就是解决方案:

    $test="infosheets/c/";
    mkdir($test);
    chmod($test,0777);
    

    您应该首先创建文件夹,然后将其权限设置为0777。他们应该为一个未知的原因单独做对我!奇怪!

        3
  •  2
  •   Dominic Rodger    16 年前
    bool mkdir(string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context]]])
    

    这个 $mode 参数是整数,而不是字符串。:)

    这里是 example :

    <?php
    mkdir("/path/to/my/dir", 0700);
    ?>
    

    必须使用:

    mkdir('jigsaw/assets/images/jigsaw_image', 0777);
    
        4
  •  1
  •   Amber    16 年前

    http://php.net/manual/en/function.mkdir.php

    第二个参数应该是int,而不是字符串。把引号拿出来。

        5
  •  1
  •   shadowdroid    10 年前

    因此,如果您喜欢我,这里还有另一个解决方案,可以尝试将诸如设置之类的东西从应用程序移到配置文件[字符串]中。

    重要的是要理解权限系统是八进制的!并使用位标记系统分组为三元组000 111 111 100,该三元组等于基数8整数0774。

    如果我们跳过前3个二进制数字,考虑一下声明性表示“rwx”,即“写入”、“读取”、“执行”,而您基本上只是将它们全部切换到“打开”每个用户、组,并且只允许对“其他”进行读取。

    所以,如果你考虑一个字节有8个位,这是一个非常有效的方法来存储255(2^8)-1个不同的可能性。尤其是当你想到Unix是什么时候写的。

    如果将其转换为十进制(以10为基数)表示,只需更改可视分组,然后根据小尾数或大尾数系统填充缺少的零位。( https://en.wikipedia.org/wiki/Endianness )

    作为小endian示例的32位表示形式 00000000 00000000 0000000 1 111111 00 也就是508,你可以把它转换成整数,然后它就可以工作了。即使您不强制转换它,解释器所做的类型推断也会起作用。

    很可能他们使用的是small int,它只使用16位而不是32:)但这更离题了…

    更多详细信息可以在这里找到:)或谷歌 https://en.wikipedia.org/wiki/Filesystem_permissions

    这只是上下文信息,因此请理解发生了什么以及下面的解决方案将如何工作。

    DR

    octdec("0774")
    

    诀窍

    推荐文章