19.11.1 Problem
19.11.2 Solution
mkdir('/tmp/apples',0777) or die($php_errormsg);
19.11.3 Discussion
The second argument to mkdir( ) is the permission mode
for the new directory, which must be an octal number. The current umask is taken
away from this permission value to create the permissions for the new directory.
So, if the current umask is 0002, calling
mkdir('/tmp/apples',0777) sets the permissions on the resulting
directory to 0775 (user and group can read, write, and execute; others
can only read and execute).
PHP's built-in mkdir( ) can make a directory only if
its parent exists. For example, if /tmp/a doesn't
exist, you can't create /tmp/a/b until /tmp/a is created. To create a directory and its
parents, you have two choices: you can call your system's mkdir
program, or you can use the pc_mkdir_parents( )
function, shown in Example 19-3. To use your system's mkdir program, on Unix, use this:
system('/bin/mkdir -p '.escapeshellarg($directory));
On Windows do:
system('mkdir '.escapeshellarg($directory));
You can also use the pc_mkdir_parents( ) function
shown in Example 19-3.
Example 19-3. pc_mkdir_parents( )
function pc_mkdir_parents($d,$umask = 0777) {
$dirs = array($d);
$d = dirname($d);
$last_dirname = '';
while($last_dirname != $d) {
array_unshift($dirs,$d);
$last_dirname = $d;
$d = dirname($d);
}
foreach ($dirs as $dir) {
if (! file_exists($dir)) {
if (! mkdir($dir,$umask)) {
error_log("Can't make directory: $dir");
return false;
}
} elseif (! is_dir($dir)) {
error_log("$dir is not a directory");
return false;
}
}
return true;
}
For example:
pc_mkdir_parents('/usr/local/upload/test',0777);