해당하는 경로안에 디렉토리를 생성해야할 경우 mkdir 함수를 사용합니다. 이 함수는 해당 경로 안에 생성할 경로명과 권한설정을 담당하며, 생성은 윈도우나 유닉스계열에 정상 동작하지만 권한설정만은 윈도우에서는 동작하지 않습니다.

bool mkdir ( string $pathname [, int $mode= 0777] )

 pathname = 생성할 경로명
 mode = 퍼미션(권한설정), 생략하면 기본값 0755로 자동 지정되며, 윈도우에서는 동작하지 않습니다.

디렉토리 생성 성공시 true를 반환하고, 실패하면 php 오류 표시를 합니다. 그러므로 mkdir함수 앞에 @를 붙여서 오류 코드가 표시되지 않도록 하여 보안 유효성을 높여 줘야 합니다.

예제 (ex #1
 <?php
 $mydir 
"dir"
;
 if(@
mkdir($mydir0777
)) {
    if(
is_dir($mydir
)) {
        @
chmod($mydir0777
);
        echo 
"${mydir} 디렉토리를 생성하였습니다."
;
    }
 }
 else {
    echo 
"${mydir} 디렉토리를 생성하지 못했습니다."
;
 }
 
?>

디렉토리 생성실패의 이유는 몇 가지가 있습니다.

존재하지 않는 경로이거나 상위폴더의 권한이 0707, 0777이 아니거나 디렉토리가 이미 생성되어 있으면 php 오류코드를 표시하게 됩니다. 권한 문제의 경우 Owner(오너)와 Public(유저)에게 쓰기권한이 없을 때 오류가 나타납니다. 쓰기권한이 있어야 생성하니까요.

  Owner(소유자) Group(그룹) Public(유저)
 Read(읽기) 400 (R) 40 (R) 4 (R)
 Write(쓰기) 200 (W) 20 (W) 2 (W)
 Execute(실행) 100 (X) 10 (X) 1 (X)
 Permission(권한) 700 (RWX) 70 (RWX) 7 (RWX)

권한작성시 주의점은 8진수로 작성해야 한다는 것입니다. 777로 권한을 처리하고자 한다면 앞자리에 0을 추가해주어 0777로 하면 자동으로 8진수로 처리하게 됩니다. 그리고 작은 따옴표('')나 큰 따옴표("")로 감싸 주어서도 안됩니다. 반드시 8진수로 작성하여야 합니다.

예제 (ex #2
 <?php
 $mydir 
"dir"
;

 @
mkdir($mydir,"0777"); 
// 잘못된 표현

 
@mkdir($mydir0777); 
// 올바른 표현

 
?>

디렉토리 정보, 즉 엔트리(Entry)를 얻고자 할때의 방법은 몇 가지있습니다. dir클레스를 이용하거나 readdir, scandir을 이용하는 것입니다.

dir 클레스를 이용한 entry 얻기

해당 디렉토리의 엔트리를 가져오기 위해서는 폴더를 먼저 "오픈"하고, "읽기", "닫기" 순으로 작성하면 됩니다.

 <?php
 $path 
"./mail"
// 오픈하고자 하는 폴더
 
$entrys = array(); 
// 폴더내 Entry를 저장하기 위한 배열
 
$dirs dir($path); 
// 오픈하기
 
while(false !== ($entry $dirs->read())){ 
// 읽기
    
$entrys[] = $entry
;
 }
 
$dirs->close(); 
// 닫기

 
var_export($entrys
);

 
/*
 결과:
 array (
  0 => '.',
  1 => '..',
  2 => 'Mail',
  3 => 'Mail.php',
  4 => 'package.xml',
  5 => 'PEAR.php',
  6 => 'tests',
 )
 */
 
?>

"."와 ".."는 기본적으로 entry 로 가져오게 됩니다. 이를 제외시켜줄 필요가 있으며, 폴더와 파일을 구분지어 정리해 줄 필요가 있겠지요. 다음과 같이 처리해 주면 됩니다.

 <?php
 $path 
"./mail"
// 오픈하고자 하는 폴더
 
$entrys = array(); 
// 폴더내의 정보를 저장하기 위한 배열
 
$dirs dir($path); 
// 오픈하기
 
while(false !== ($entry $dirs->read())){ 
// 읽기
    
if(($entry != '.') && ($entry != '..'
)) {
        if(
is_dir($path.'/'.$entry)) { 
// 폴더이면
             
$entrys['dir'][] = $entry
;
        }
        else { 
// 파일이면
             
$entrys['file'][] = $entry
;
       }
    }
 }
 
$dirs->close(); 
// 닫기

 
$dircnt count($entrys['dir']); 
// 폴더 수
 
$filecnt count($entrys['file']); 
// 파일 수

 
echo "폴더 수: ${dircnt} 파일 수:${filecnt}<br/>\n"
;
 
var_export($entrys
);

 
/*
 결과:
 폴더 수: 2 파일 수:3<br/>
 array (
  'dir' => 
  array (
    0 => 'Mail',
    1 => 'tests',
  ),
  'file' => 
  array (
    0 => 'Mail.php',
    1 => 'package.xml',
    2 => 'PEAR.php',
  ),
 )
 */
 
?>


readdir를 이용한 entry 얻기

readdir함수로 엔트리를 얻을 수 있지만 opendir 함수와 closedir 함수가 필요합니다. 순서는 같습니다. opendir 로 오픈하고, readdir 로 읽고, closedir 로 닫아 주면 됩니다.

 <?php
 $path 
"./mail"
// 오픈하고자 하는 폴더
 
$entrys = array(); 
// 폴더내의 정보를 저장하기 위한 배열
 
$dirs opendir($path); 
// 오픈하기
 
while(false !== ($entry readdir($dirs))){ 
// 읽기
    
$entrys[] = $entry
;
 }
 
closedir($dirs); 
// 닫기

 
var_export($entrys
);

 
/*
 결과:
 array (
  0 => '.',
  1 => '..',
  2 => 'Mail',
  3 => 'Mail.php',
  4 => 'package.xml',
  5 => 'PEAR.php',
  6 => 'tests',
 )
 */
 
?>


scandir를 이용한 entry 얻기

scandir함수는 (PHP 5)이상부터 지원을 합니다. 이하 버전에서는 오픈하고 읽고, 닫기 순으로 처리해 주어야 가능하지만, (PHP 5)부터 scandir 함수 하나로 모든 처리가 가능해 졌습니다.

array scandir ( string $directory [, int $sorting_order [, resource $context ]] )

$directory 은 탐색할 디렉토리, $sorting_order 은 정렬 순서입니다. $sorting_order 에 1을 대입하면 역순으로 데이터를 정렬합니다.

 <?php
 $dir    
'/tmp'
;
 
$files1 scandir($dir); 
// 오름차순으로 엔트리 얻기
 
$files2 scandir($dir1); 
// 내림차순으로 엔트리 얻기

 
print_r($files1
);
 
print_r($files2
);

 
/*
 결과:
 Array
 (
    [0] => .
    [1] => ..
    [2] => bar.php
    [3] => foo.txt
    [4] => somedir
 )
 Array
 (
    [0] => somedir
    [1] => foo.txt
    [2] => bar.php
    [3] => ..
    [4] => .
 )
 */
 ?> 


readdir함수로도 가능합니다.

<?php
 $dir 
"/tmp"
;
 
$dh  opendir($dir
);
 while (
false !== ($filename readdir($dh
))) {
    
$files[] = $filename
;
 }

sort($files); 
// 오름차순으로 정렬

print_r($files
);

rsort($files); 
// 내림차순으로 정렬

print_r($files
);

 
/*
 결과:
 Array
 (
    [0] => .
    [1] => ..
    [2] => bar.php
    [3] => foo.txt
    [4] => somedir
 )
 Array
 (
    [0] => somedir
    [1] => foo.txt
    [2] => bar.php
    [3] => ..
    [4] => .
 )
 */
 ?>