본문 바로가기
PHP

[PHP] mkdir(), rmdir(), is_dir(), scandir(), filetype(), unlink()

by 똑똑한 영장류 2013. 1. 17.



php로 디렉토리를 만들려고 mkdir()를 이용했습니다만, 삽질을 좀 했네요..ㅡ.ㅡ


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





php 가 실행되는 동안 현재 디렉토리 . 은 php 파일이 위치하고 있는 디렉토리를 의미하죠.


www/dir1/a.php 가 있다고 가정합니다.


a.php 안에서 아래 mkdir()를 실행시킵시다.



mkdir('test');


www/dir1/test/ 가 생깁니다.


mkdir('./test'); 와 결과가 같지요.


mkdir('../test');


www/test/ 가 생깁니다.


이제 삽질한 부분..ㅡ.ㅡ



www/test/test1 을 만들고 싶어서 아래와 같이 작성했었습니다.



mkdir('../test/test1');


결과는 실패...


www/test를 만들고 그 안에 들어가서 다시 test1 을 만들어야하죠.

recursive 한 상황이 생긴겁니다. 이걸 모르고 계속 다른 원인을 찾아 해맸습니다. ㅋ


디렉토리 하나가 아니고, 그 아래에 더, 더, 만들고 싶을 때는 recursive 인자를 true 로 설정하고 함수를 호출해야합니다.


mkdir('../test/test1', 0777, true);


0777 디렉토리의 권한설정입니다. 기본 값이 0777 이네요.


아! 그리고,


mkdir('../test/test1');


mkdir('../test/test1/');

는 같습니다.

디렉토리 이름 뒤에 / 를 붙여도 되고 안 붙여도 됩니다.


만든 디렉토리를 삭제하는 방법은 rmdir()입니다.


bool rmdir ( string $dirname [, resource $context ] )


이건 쉽습니다.


rmdir('../test/test1');


이렇게 하면 상위 디렉토리 test 안에 있는 test1 디렉토리를 삭제합니다.


그럼, rmdir('../test/'); 라고 하면, 그 안에 있는 test1 도 몽땅 같이 지워질까요??


recursive 하게 동작을 할까요??


No, recursive 하게 동작하지 않습니다.


그래서 , php.net 의 rmdir() 설명 부분에 있는 예를 올립니다. recursive 하게 동작하는, 하위 디렉토리까지 모조리 삭제해주는 코드입니다.



<?php
 function rrmdir($dir) {
   if (is_dir($dir)) {
     $objects = scandir($dir);
     foreach ($objects as $object) {
       if ($object != "." && $object != "..") {
         if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
       }
     }
     reset($objects);
     rmdir($dir);
   }
 }
?> 


rrmdir() 함수 내에 다시 rrmdir() 함수가 보이죠?? 까칠한 재귀함수입니다.



못 본 함수가 몇개 있네요.


is_dir()


bool is_dir ( string $filename )


$filename으로 입력해준 값이 존재하는 디렉토리라면 true를 리턴해줍니다.




scandir()


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


디렉토리를 지정하면 그 안에 있는 파일과 디렉토리를 배열로 리턴해주는 함수 입니다.



filetype()


string filetype ( string $filename )


$filename 의 타입을 리턴해줍니다. 유닉스, 리눅스의 경우, 모든 것이 파일로 처리됩니다. 그것들 중에 디렉토리도 있고, 파일도 있고, 소켓도 있고 머 그렇죠.


리턴값은 아래의 것들 중 하나입니다.


Possible values are fifo, char, dir, block, link, file, socket and unknown.


아니면, FALSE



unlink()


bool unlink ( string $filename [, resource $context ] )


파일을 지웁니다.




삽질하지 맙시다..



'PHP' 카테고리의 다른 글

[설정] date.timezone  (0) 2013.02.05
[PHP] array_push(), array_pop()  (0) 2013.01.23
[PHP] number_format()  (0) 2012.12.24
[PHP] move_uploaded_file()  (0) 2012.12.21
[PHP] time(), date(), mktime()  (0) 2012.12.21

댓글