我可以发誓昨天这个工作了。 现在,下面的代码可以毫无问题地破坏该文件夹,但是当它应为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');
因为您应该使用八进制立即数0777,而不是字符串中的数字"0777"(实际上是八进制的01411)。
哦,该死的! 我确信这是一个掩盖问题。
请注意,mkdir(path, 777)也将导致八进制01411。
我有一个同样的问题,但是即使删除引号,该权限也不会设置为0777。
mkdir("infosheets/c/" , 0777);
但是创建的文件夹设置为0755!
多数民众赞成在解决方案:
$test="infosheets/c/";
mkdir($test);
chmod($test,0777);
您应该首先制作该文件夹,然后将其权限设置为0777。由于我的未知原因,应该分别进行处理!奇怪!
我也有同样的问题
这可能是由于umask设置为非0的原因。您的解决方案可用于创建单个目录,但是使用mkdir(递归)创建完整的目录树时,您需要将umask设置为零(也许 再次返回),例如 $old_umask = umask(0); mkdir($test); umask($old_umask)
bool mkdir(string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context]]])
$mode参数是整数,而不是字符串。 :)
例子如下:
mkdir("/path/to/my/dir", 0700);
?>
您必须使用:
mkdir('jigsaw/assets/images/jigsaw_image', 0777);
因此,如果您喜欢我尝试将诸如设置之类的内容从应用程序移至配置文件[strings]中,则这是另一种解决方案。
重要的是要知道,权限系统是八进制的!并使用以三胞胎000 111 111 100分组的位标记系统,该系统等于以8为底的整数0774。
如果我们跳过前3个二进制数字并考虑声明性表示形式" rwx",即"写""读""执行",而您基本上只是将每个用户,组将所有它们都切换为"开",并且只允许对"其他"。
因此,如果您考虑一个字节,则它具有8位,这是存储255(2 ^ 8)-1个不同可能性的一种非常有效的方法。特别是当您考虑Unix的编写时间时。
如果将其转换为十进制(以10为底)表示形式,则只需更改视觉分组,然后根据大小端或大小端系统(https://en.wikipedia.org/wiki/Endianness)填充丢失的零位。
作为小端顺序示例的32位表示形式
00000000 00000000 00000001 11111100
aka 508,您实际上可以将其转换为整数,它将正常工作。即使您不强制转换,解释器也可以进行类型推断。
他们很可能使用small-int,它只会使用16位而不是32位:),但这更不是话题了...
更详细的信息可以在这里找到:)或google
https://zh.wikipedia.org/wiki/文件系统_权限
这只是作为上下文信息,因此请了解发生了什么以及以下解决方案将如何工作。
TL; DR
octdec("0774")
绝招
http://php.net/manual/zh/function.mkdir.php
第二个参数应该是一个整数,而不是字符串。取出报价。