Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
PHP: mkdir - Manual
[go: Go Back, main page]

PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

move_uploaded_file" width="11" height="7"/> <lstat
Last updated: Sun, 25 Nov 2007

view this page in

mkdir

(PHP 4, PHP 5)

mkdir — ディレクトリを作る

説明

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

指定したディレクトリを作成します。

パラメータ

pathname

ディレクトリのパス。

mode

モードは 0777 がデフォルトです。 これは最も緩やかなアクセス制限を意味します。 モードに関する詳細は chmod() をご覧ください。

注意: Windows では mode は無視されます。

モードを八進数で指定したくなることもあるかもしれません。 その場合は先頭にゼロをつける必要があります。 また、モードは、現在設定されている umask の影響も受けます。 umask を変更するには umask() を使用します。

recursive

context

注意: コンテキストのサポートは、 PHP 5.0.0 で追加されました。contexts の説明に関しては、 ストリーム を参照してください。

返り値

成功した場合に TRUE を、失敗した場合に FALSE を返します。

変更履歴

バージョン 説明
5.0.0 recursive パラメータが追加されました。
5.0.0 PHP 5.0.0 以降、mkdir()いくつかの URL ラッパーを併用することが可能です。 mkdir() をサポートしているラッパーの一覧については、 サポートされるプロトコル/ラッパー を参照ください。
4.2.0 mode パラメータがオプションとなりました。

Example#1 mkdir() の例

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

注意

注意: セーフモード が有効の場合、PHP は、 操作を行うディレクトリが、実行するスクリプトと同じ UID (所有者)を有しているか どうかを確認します。

参考



move_uploaded_file" width="11" height="7"/> <lstat
Last updated: Sun, 25 Nov 2007
 
add a note add a note User Contributed Notes
mkdir
php at msn dot net
09-Mar-2008 03:05
<?php

/**
 * Makes directory, returns TRUE if exists or made
 *
 * @param string $pathname The directory path.
 * @return boolean returns TRUE if exists or made or FALSE on failure.
 */

function mkdir_recursive($pathname, $mode)
{
   
is_dir(dirname($pathname)) || mkdir_recursive(dirname($pathname), $mode);
    return
is_dir($pathname) || @mkdir($pathname, $mode);
}

?>
horvoje on gmail
04-Mar-2008 04:30
> CON is the console. To create a file from
> scratch under dos you do: COPY CON filename.txt
> It then allows you to type until you press CTRL-D.

It is Ctrl+Z actually :)
code at ashleyhunt dot co dot uk
15-Feb-2008 04:15
Here's a script to create a recursive directory path on NAS or another server using Common Internet File System (CIFS)

e.g. you already have a directory on a server
\\server/share/dir1/dir2

you want to create some more directories
\\server/share/dir1/dir2/dir3/dir4

<?php
function remote_mkpath($server, $path)  {
       
$dirs = array();
       
$path = preg_replace('/(\/){2,}|(\\\){1,}/','/',$path); //only forward-slash
       
$dirs = explode("/", $path);
       
$path = "\\\\" . $server . "/";
       
$i = 0;
        foreach (
$dirs AS $element) {
           
$path .= $element . "/";
            if(!
is_dir($path) && $i != 0) {
                if(!
mkdir($path)){
                    echo
"something was wrong at : " . $path;
                    return
0;
                }
            }  
           
$i++;
        }
        return
true;
        echo
$path;
}

// example usage
remote_mkpath("SERVER", "share/dir1/dir2/dir3/dir4");
?>

Good luck!

Ashley
david dot NOSPAM at ajnewmedia dot NOSPAM dot co dot uk
22-Jan-2008 02:04
p-garcia : since PHP 5, setting the recursive flag (which currently has no notes in the manual entry) will allow you to create nested directories in the same way as Windows / Linux mkdir -p, so long as the webserver has permissions to write in the root directory of the path specified
eg:

<?php
  mkdir
("./newdir1/newdir2/newdir3/", 0755, true);

 
// Returns TRUE if you have permission to write to the current directory
  //   and creates nested directories with permissionsrwxr-xr-x
?>
p-garcia at uniandes dot edu dot co
22-Jan-2008 10:45
After a long time trying to catch the cause of the warning: "mkdir() [function.mkdir]: No such file or directory", I finally realized that this function is not recursive; I mean, that if you want to create the folder -for example- c:\temp\t1\t2, you must do:
mkdir("c:\\temp\\t1") ;
mkdir("c:\\temp\\t1\\t2") ;

because mkdir is not like the windows mkdir where you can acomplish this in one single step.
Michal Nazarewicz, mina86 at tlen dot pl
10-Sep-2007 05:36
dude at patabugen, try <?php umask(0); ?> before <?php mkdir($gallery."/".$name, 0755); ?>.
dude % patabugen ^ co &#34; uk
05-Sep-2007 10:30
I had some problems creating directories and then not being able to access them because of permissions. The only way i have found to get around the problem was to create them with 0777 then chmod them to 4755.
<?PHP
    mkdir
($gallery."/".$name, 0755);
   
chmod($gallery."/".$name, 4755);
?>
Michal Nazarewicz, mina86 at mina86 dot com
27-Aug-2007 11:34
On the other hand, splitting path on something else then a DIRECTORY_SEPARATOR may give unexpected results when someone accualy wants a file name with backslash in it! Moreover, neither Alan's nor pluto's code check for errors or return any value. Also, I don't like the isset($folder[$i]) technique -- there is a count() function you know.

<?php
function recursive_mkdir($path, $mode = 0777) {
   
$dirs = explode(DIRECTORY_SEPARATOR , $path);
   
$count = count($dirs);
   
$path = '.';
    for (
$i = 0; $i < $count; ++$i) {
       
$path .= DIRECTORY_SEPARATOR . $dirs[$i];
        if (!
is_dir($path) && !mkdir($path, $mode)) {
            return
false;
        }
    }
    return
true;
}
?>

It will only fail if someone specifies a mode which does not allow owner to create new entries in directory.
kendsnyder at gmail dot com
05-May-2007 12:17
When creating directories in Windows, trailing periods (".") are ignored.  for example:

<?php

mkdir
('c:/Buck Jr.',0755);    // on Windows creates "c:/Buck Jr"
mkdir('c:/Elipses...',0755);  // on Windows creates "c:/Elipses"
mkdir('c:/php.com',0755);     // on Windows creates "c:/php.com"

?>

This is a Window's quirk, not a php shortcoming--meaning that you get the same results from a Window's command prompt.
glenn at bengeweb dot co dot nz
13-Mar-2007 02:00
I've discovered that since my (shared) hosting provider upgraded to PHP 5.1.6 , a script containing this mkdir doesn't work:

<?php
mkdir
('/home/benge/photos/gallery1/extra_large/', 0777);
?>

but this does work:
<?php
mkdir
('/home/benge/photos/gallery1/extra_large', 0777);
?>

the difference being, the trailing slash "/" after "extra_large.

There were three ways to fix the problem:
1. remove the trailing slash from the script code
2. downgrade to < PHP 5.1.6
3. turn safe mode off

I went with option 1.
sean at pedlr dot com
09-Mar-2007 01:58
It should be noted that although the documentation says that  the default permissions for mkdir are 0777, this is not always the case.

I'm running LAMP and without explicitly setting the permissions, the directories created had permissions of 0755.
Ari Schulman (ario [] mail utexas edu)
09-Jan-2007 08:02
Re: john 4t idserver d0t org, and djneoform at gmail dot com's posts from 27 Oct 2006:

On Windows systems, several keywords are reserved and cannot be used as filenames, in addition to just CON and PRN.  Attempting to create a folder with one of these names using mkdir will throw the unhelpful error "Invalid argument".  According to http://msdn.microsoft.com/library/default.asp ?url=/library/en-us/fileio/fs/naming_a_file.asp :

"Do not use the following reserved device names for the name of a file: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9. Also avoid these names followed by an extension, for example, NUL.tx7.

    Windows NT:  CLOCK$ is also a reserved device name."

These keywords are also case-insensitive.  I don't know what problems are posed by using these keywords with extensions, but I successfully created a folder named "con_f".
fantasysportswire at yahoo dot com
21-Dec-2006 11:07
One small correction on a note from Frank in June 2006 on recursive directories under Windows.

First - this should be in the documentation as its the only function that I know of that php does not fix the slashes automatically.

Franks note stated:

<?php
   $mypath
="testdir\subdir\test";
  
mkdir($mypath,0777,TRUE);
?>

This doesn't work in windows:

<?php
   $mypath
="testdir/subdir/test";
  
mkdir($mypath,0777,TRUE);
?>

----

This will work a bit better :)

<?php
   $mypath
="testdir\\subdir\\test";
  
mkdir($mypath,0777,TRUE);
?>
v1d4l0k4 {at} gmail.com
13-Nov-2006 12:42
The 'mkdir' function doesn't function correctly on Windows when the pathname contain space(s) on the final. PHP returns a warning, and the directory isn't created:

Warning: mkdir() [function.mkdir]: Invalid argument in X on line Y

Temporary fix: use trim() on the pathname

Besides, if the pathname contain space(s) on the start, the directory is created when couldn't even so (in accordance with the behavior of Windows Explorer).

~ v1d4l0k4
john 4t idserver d0t org
28-Oct-2006 03:27
Windows reserves the names PRN and CON as they are devices in DOS. Back in the day, you could easily print a document via "type filename.txt > PRN".

CON is the console. To create a file from scratch under dos you do: COPY CON filename.txt

It then allows you to type until you press CTRL-D.
djneoform at gmail dot com
27-Oct-2006 11:28
Forewarning to windows users.

If you try to create a directory called "prn" or "con" windows will reject the name and cause an error.

apparently (i found this out the hard way) windows simply cannot have directories by those names, who knows why..
mroy at matthewroy dot com
11-Oct-2006 11:51
fixed bug with the previous script: 

else if (!ftp_site($connection, "CHMOD 0777 $newDir"){ // change attributes

is missing an ")" so it should read:

else if (!ftp_site($connection, "CHMOD 0777 $newDir")) { // change attributes
PHGN
14-Aug-2006 03:13
I've been wrestling with mkdir on a server with safe mode turned on (I think, I kept getting barmy permissions on the new dirs).

In the end the solution was to use:
exec (mkdir ...
exec (chmod ...

For this to work I had to use the setuid bit on the script itself. I tried this with the mkdir() function, but to no avail. (To do the setuid bit I ran chmod 4775 on the script file from the command line.)
kungla at gmail dot com
18-Jul-2006 09:41
Somehow the recursive version of mkdir didn't work for me on Mac and the workaraounds listed below alsow didn't work for me, so heres my solution:

<?php
function mkdir_r($dirName, $rights=0777){
   
$dirs = explode('/', $dirName);
   
$dir='';
    foreach (
$dirs as $part) {
       
$dir.=$part.'/';
        if (!
is_dir($dir) && strlen($dir)>0)
           
mkdir($dir, $rights);
    }
}
?>

Tested and works ;)
jamespilcher1hotmail
08-Apr-2006 09:53
one small gotcha:

mkdir(""), mkdir(false), and mkdir(null) give a "file exists" error. this is also true of a directory name consisting of any string that only contains space characters.

(this was on php 5.1.2 on Windows 2000)
bat at flurf dot net
22-Mar-2006 02:23
A little understanding of LISPlike programming makes this sort of task (recursive mkdir()ing in PHP4) much simpler.  This version works nicely:

<?php
function MakeDirectory($dir, $mode = 0755)
{
  if (
is_dir($dir) || @mkdir($dir,$mode)) return TRUE;
  if (!
MakeDirectory(dirname($dir),$mode)) return FALSE;
  return @
mkdir($dir,$mode);
}
?>

How it works: line one attempts to make the directory, and returns TRUE if it works or if it already exists.  That's the easy case if the parent directories all exist.

Line two trims off the last directory name using dirname(), and calls MakeDirectory recursively on that shorter directory.  If that fails, it returns FALSE, but otherwise we come out of it knowing that the parent directory definitely exists.

Finally, presuming the recursive call worked, once we get to line three we can create the requested directory.

Note the use of @ to suppress warning messages from mkdir.

The beauty of this is that if, say, the great-grandparent directory exists but the grandparent and parent directories don't, the function will simply call itself recursively until it gets high enough up the tree to do some work, then carry on unwinding back until all the new directories have been created.

This is pretty bog-standard recursive programming.  Anyone who can't wrap their head around it after a few minutes of concentration should probably try a career in sales.
Ali Baba
11-Mar-2006 06:26
Greg, your code does not work for me; maybe it has a bug or we have configuration changes. Anyway, this one works to create recursively the directory DIRECTORY.

<?
define
("DIRECTORY", "/tmp/mydir/mysubdir");

do {
   
$dir = DIRECTORY;
    while (!
is_dir($dir)) {
       
$basedir = dirname($dir);
        if (
$basedir == '/' || is_dir($basedir))
           
mkdir($dir,0777);
        else
           
$dir=$basedir;
   }
} while (
$dir != DIRECTORY);

?>
19-Jan-2006 02:48
function mkdirs($dir, $mode = 0777, $recursive = true) {
  if( is_null($dir) || $dir === "" ){
    return FALSE;
  }
  if( is_dir($dir) || $dir === "/" ){
    return TRUE;
  }
  if( mkdirs(dirname($dir), $mode, $recursive) ){
    return mkdir($dir, $mode);
  }
  return FALSE;
}
Sean at seanj dot jcink dot com
24-Dec-2005 11:10
Mkdir will work on parent directories as long as file permissions are right and the openbase restriction is not on.

~Sean
trond at trondhuso dot no
14-Dec-2005 05:10
While researching for this function, I have found out that - at least on my system - mkdir only works when the parent directory is the one your script is in.
eg:
you want to create a directory tmp
mkdir ('tmp', 0775);
will create /path/to/your/script/tmp

but if you this
mkdir ('/path/to/your/tmp', 0755);
or
mkdir ('../tmp', 0755);

both will cause an error - permission denied.

Trond
Kevin Cook
03-Nov-2005 02:14
I could not get the sticky bit set properly using the octal mode: 2775 (rwxrwsr-x)

$foo='my_directory';

$old_umask = umask(0);
mkdir($foo,2775);
umask($old_umask);

using the above lines renders a directory with permissions:

d-wx-wSrwt  2 www www 4096 Nov  2 11:43 my_directory

Not exactly what I was looking for.

This gets closer to the mark:

$foo='my_directory';

$old_umask = umask(0);
mkdir($foo,0777); // the default chmod
umask($old_umask);

drwxrwsrwx  2 www www 4096 Nov  2 11:46 my_directory
ephraim at coder-board dot info
11-Oct-2005 03:38
When safe_mode is enabled, and you create a directory via mkdir, you can't create a second inside the first because the first folder's user is that one of the webserver and not that one of the script. This is dumb and very annoying :(
funke
17-Sep-2005 04:51
Ive onlybeen coding in PHP for a couple of months so i Don't have all the syntax tricks down yet.

I wrote this function to create all the dirs in a path if they don't exist. its not actually recursive but i was to lazy to change the name  :)
theoretically i want it to work for both win and nix. As soon my project manager gets me a win box i'm gonna test it out.  anyrevisions to the function below would be appreciated.

<?php
// \

function recur_mkdirs($path, $mode = 0777) //creates directory tree recursively
{
   
//$GLOBALS["dirseparator"]
   
$dirs = explode($GLOBALS["dirseparator"],$path);
   
$pos = strrpos($path, ".");
    if (
$pos === false) { // note: three equal signs
       // not found, means path ends in a dir not file
       
$subamount=0;
    }
    else {
       
$subamount=1;
    }
   
    for (
$c=0;$c < count($dirs) - $subamount; $c++) {
       
$thispath="";
        for (
$cc=0; $cc <= $c; $cc++) {
           
$thispath.=$dirs[$cc].$GLOBALS["dirseparator"];
        }
        if (!
file_exists($thispath)) {
           
//print "$thispath<br>";
           
mkdir($thispath,$mode);
        }
       
       
    }
   
}
?>
Steven Ng
09-Jun-2005 03:37
I had to remove the $path in the CHMOD command before the function worked for me. The function was at the $path directory prior to initiating the CHMOD command, so it tried to go down the $path directory again.

// create directory through FTP connection
function FtpMkdir($path, $newDir) {
 
       $server='ftp.server.com'; // ftp server
       $connection = ftp_connect($server); // connection
 
 
       // login to ftp server
       $user = "me";
       $pass = "pass";
       $result = ftp_login($connection, $user, $pass);

   // check if connection was made
     if ((!$connection) || (!$result)) {
       return false;
       exit();
       } else {
         ftp_chdir($connection, $path); // go to destination dir
       if(ftp_mkdir($connection, $newDir)) { // create directory
       ftp_site($connection, "CHMOD 777 $newDir") or die("FTP SITE CMD failed.");
           return $newDir;
       } else {
           return false;    
       }
 
   ftp_close($connection); // close connection
   }

}
FtpMkdir("path","dir");
roth at egotec dot com
23-May-2005 03:43
The 'mkdir' function doesn't function correctly on Windows when the path
contains forward slashes. The part of the path with the forward slashes
doesn't get created.

mkdir('c:/a/b/c/d', 0775, true);

You get the error message:
Warning: mkdir() [function.mkdir]: No such file or directory

Please use backslashes under Windows or use the constant DIRECTORY_SEPARATOR.

mkdir('c:\a\b\c\d', 0775, true);
mkdir('c:'.DIRECTORY_SEPARATOR.'a'.
DIRECTORY_SEPARATOR.'b'.
DIRECTORY_SEPARATOR.'c'.
DIRECTORY_SEPARATOR.'d', 0775, true);
webmaster2007 at home dot nl
29-Apr-2005 12:27
Maybe you can use this:

<?php
   
function open_dir($dir, $newdir){    //The function that will copy the files
       
if(file_exists($dir) && file_exists($newdir)){
           
$open_dir=opendir($dir);
            while (
false !== ($file = readdir($open_dir))) {
                if(
$file != "." && $file != ".."){
                    if(
file_exists($newdir."/".$file) && filetype($newdir."/".$file."/") != "dir"){
                       
unlink($newdir."/".$file);
                    }
                    if(
filetype($dir."/".$file."/") == "dir"){
                        if(!
file_exists($newdir."/".$file."/")){
                           
mkdir($newdir."/".$file."/");
                           
open_dir($dir."/".$file."/", $newdir."/".$file."/");
                        }
                    }
                    else {
                       
copy($dir."/".$file."/", $newdir."/".$file);
                    }
                }
            }
        }
    }
   
   
   
open_dir("Your source map", "Your destination map"); //Here you can fill in your source en destination map
?>
yknot7 at hotmail dot com
14-Apr-2005 03:59
Add permission using CHMOD in the above mentioned

// create directory through FTP connection
function FtpMkdir($path, $newDir) {
 
       $server='ftp.server.com'; // ftp server
       $connection = ftp_connect($server); // connection
 
 
       // login to ftp server
       $user = "me";
       $pass = "pass";
       $result = ftp_login($connection, $user, $pass);

   // check if connection was made
     if ((!$connection) || (!$result)) {
       return false;
       exit();
       } else {
         ftp_chdir($connection, $path); // go to destination dir
       if(ftp_mkdir($connection, $newDir)) { // create directory
       ftp_site($connection, "CHMOD 777 $path/$newDir") or die("FTP SITE CMD failed.");
           return $newDir;
       } else {
           return false;      
       }
   
   ftp_close($connection); // close connection
   }

}
FtpMkdir("path","dir");
Protik Mukherjee
04-Mar-2005 02:29
mkdir, file rw, permission related notes for Fedora 3////
If you are using Fedora 3 and are facing permission problems, better check if SElinux is enabled on ur system. It add an additional layer of security and as a result PHP cant write to the folder eventhough it has 777 permissions. It took me almost a week to deal with this!

If you are not sure google for SElinux or 'disabling SELinux' and it may be the cure! Best of luck!
Han Van den Hoof
10-Nov-2003 03:28
If you're on a shared *nix server, a directory created through mkdir() will not be assigned to you, but to the user that your host's server or php process is running under, usually 'nobody', 'apache' or 'httpd'.

In practice, this means that you can create directories, even add files to them, but you can't delete the directory or its contents nor change permissions.

It is therefore advised to create directories through PHP's FTP API. Here's a function I wrote:

<?php
// create directory through FTP connection
function FtpMkdir($path, $newDir) {
  
      
$server='ftp.yourserver.com'; // ftp server
      
$connection = ftp_connect($server); // connection
  
 
       // login to ftp server
      
$user = "me";
      
$pass = "password";
      
$result = ftp_login($connection, $user, $pass);

   
// check if connection was made
     
if ((!$connection) || (!$result)) {
        return
false;
        exit();
       } else {
         
ftp_chdir($connection, $path); // go to destination dir
       
if(ftp_mkdir($connection,$newDir)) { // create directory
           
return $newDir;
        } else {
            return
false;       
        }
   
ftp_close($conn_id); // close connection
   
}

}
?>

Hope this comes in handy for someone.
28-Jun-2003 08:00
You might notice that when you create a new directory using this code:

mkdir($dir, 0777);

The created folder actually has permissions of 0755, instead of the specified
0777. Why is this you ask? Because of umask(): http://www.php.net/umask

The default value of umask, at least on my setup, is 18. Which is 22 octal, or
0022. This means that when you use mkdir() to CHMOD the created folder to 0777,
PHP takes 0777 and substracts the current value of umask, in our case 0022, so
the result is 0755 - which is not what you wanted, probably.

The "fix" for this is simple, include this line:

$old_umask = umask(0);

Right before creating a folder with mkdir() to have the actual value you put be
used as the CHMOD. If you would like to return umask to its original value when
you're done, use this:

umask($old_umask);
aulbach at unter dot franken dot de
23-Jul-1999 06:37
This is an annotation from Stig Bakken:

The mode on your directory is affected by your current umask.  It will end
up having (<mkdir-mode> and (not <umask>)).  If you want to create one
that is publicly readable, do something like this:

<?php
$oldumask
= umask(0);
mkdir('mydir', 0777); // or even 01777 so you get the sticky bit set
umask($oldumask);
?>

move_uploaded_file" width="11" height="7"/> <lstat
Last updated: Sun, 25 Nov 2007
 
 
show source | credits | sitemap | contact | advertising | mirror sites