Erzsamatory Weblog


PHP에서 디렉터리를 삭제할 때에는 rmdir() 함수를 사용합니다. 하지만 이 함수는 콘텐츠가 존재하지 않는 디렉터리만 삭제할 수 있습니다. 즉, 파일이나 디렉터리를 포함하는 객체는 삭제할 수 없습니다. 따라서 디렉터리 한 개를 삭제하려면, 디렉터리 하부의 모든 파일들과 디렉터리를 일일이 삭제해야 하는데, 이것은 개발자에게 매우 까다로운 일입니다. 이러한 문제점을 해결하기 위하여, 필자는 여러 콘텐츠를 포함하고 있는 디렉터리를 삭제할 때 사용할 수 있는 PHP 함수를 직접 만들어보았습니다. 이 함수가 PHP 프로그래밍에 많은 도움이 되었으면 좋겠습니다.

PHP rmdir() 함수 설명 페이지
http://www.php.net/rmdir


PHP의 디렉터리 삭제 함수 rmdir()


PHP에서 디렉터리를 삭제할 때에는 rmdir() 함수를 이용합니다. 이 함수는 리눅스의 rmdir 명령어와 동일한 역할을 수행합니다. 따라서 리눅스에서도 그러하듯이, PHP에서도 rmdir() 함수는 하위 디렉터리나 파일이 존재할 때에는 해당 디렉터리를 삭제할 수 없습니다.

그러나 리눅스에서는 rm 명령어와 함께 특수한 매개변수(-rf)를 통하여 디렉터리 하부에 다른 파일이나 디렉터리가 있더라도 강제적으로 그 디렉터리를 삭제할 수 있습니다. PHP에서는 리눅스의 rm 명령어와 같은 함수를 지원하지 않기 때문에, PHP 개발자가 하위에 다른 콘텐츠가 존재하는 디렉터리를 삭제할 때에는 매우 까다로운 작업을 반복적으로 해야 합니다.


만능 디렉터리 삭제 함수 removeDir()


이 글에서 설명하는 새로운 함수는 매우 단순한 구조로 되어있습니다. 가장 먼저, 개발자가 삭제하고자 하는 디렉터리의 핸들을 생성한 후, 그 디렉터리의 하위에 다른 디렉터리나 파일 등 기타 콘텐츠가 있는지를 검사합니다. 만약 하위 콘텐츠가 있는 경우에는 재귀 함수를 호출하고 파일이 있을 때에는 unlink() 함수를 이용하여 해당되는 파일을 삭제합니다.

removeDir() 함수는 우선적으로 디렉터리 하위에 있는 모든 콘텐츠를 삭제한 후, 최종적으로 개발자가 지정한 디렉터리를 삭제합니다. PHP의 가장 기본적인 반복 구문인 while() 구문과 PHP의 기본 함수 rmdir()과 unlink()를 사용하여 반복적으로 하위의 파일들과 디렉터리들을 일일이 삭제하는 함수입니다. 디렉토리 하위 콘텐츠의 갯수가 많다면 시간이 비교적 오래 걸리겠지만, 개발자가 직접 여러 디렉터리나 파일들을 삭제할 필요가 없기 때문에, 이 함수를 사용하면 PHP 개발을 할 때 매우 편리할 것입니다.

특히 이 함수는 SSH 및 Telnet이 지원되지 않는 웹호스팅을 사용하는 PHP 개발자가 사용하면 매우 좋습니다. 왜냐하면 SSH나 Telnet을 사용할 수 있다면 원격 소프트웨어를 통하여 리눅스의 rm 명령어를 실행할 수 있기 때문입니다.

하위 컨텐츠 포함 디렉터리를 삭제하는 removeDir() 함수의 소스코드


function removeDir ($path)
{
    // 디렉토리 구분자를 하나로 통일시킴
    $path = str_replace('\'', '/', $path);
    
    // 경로 마지막에 존재하는 디렉토리 구분자는 삭제
    if ($path[(strlen($path)-1)] == '/') {
        $tmp = '';
        for ($i=0; $i < (strlen($path) -1); $i++) {
            $tmp .= $path[$i];
        }
        $path = $tmp;
    }
    
    // 존재하는 디렉토리인지 확인
    // 존재하지 않으면 false를 반환
    if (!file_exists($path)) {
        return false;
    }
    
    // 디렉토리 핸들러 생성
    $oDir = dir($path);
    
    // 디렉토리 하부 컨텐츠 각각에 대하여 분석하여 삭제
    while (($entry = $oDir->read())) {
        // 상위 디렉토리를 나타내는 문자열인 경우 처리하지 않고 continue
        if ($entry == '.' || $entry == '..') {
            continue;
        }
        
        // 또 다른 디렉토리인 경우 함수 실행
        // 파일인 경우 즉시 삭제
        if (is_dir($path.'/'.$entry)) {
            removeDir($path.'/'.$entry);
        } else {
            unlink($path.'/'.$entry);
        }
    }
    
    // 해당 디렉토리 삭제
    rmdir($path);
    
    // 결과에 따라 해당 디렉토리가 삭제되지 않고 존재하면 false를 반환 반대의 경우에는 true를 반환
    if (file_exists($path)) {
        return false;
    } else {
        return true;
    }
}


이 소스코드는 다음과 같은 방법으로 사용됩니다. 만약 삭제하고 싶은 디렉터리가 files 라면 다음과 같은 방법으로 해당되는 디렉터리의 모든 내용들과 해당 디렉터리를 삭제할 수 있습니다.

removeDir('files');



마무리


PHP는 개발자가 사용하기에 매우 편리한 웹프로그래밍 언어입니다. 다양한 기능들이 매우 많은 함수들고 미리 구현되어 있어 개발자는 이 함수들만 끌어다가 사용하면 되기 때문입니다. 하지만 rmdir() 함수와 같이 사용하기에 약간 불편한 함수들도 있습니다. 때문에 이와 같은 함수들은 단독으로는 잘 사용되지 않으며, 이 글에서 소개하고 있는 방법과 같이 개발자가 직접 함수를 약간 수정하여 사용하는 것이 관례입니다.

PHP 공식 홈페이지에 들어가보면 각 함수마다 사용하는 것이 더 편리할 수 있도록 개발자들이 만들어놓은 소스코드가 많이 있습니다. 한 번 들어가보셔서 참고하시면 PHP 프로그래밍을 하는데에 매우 큰 도움이 될 것입니다.
http://www.erzsamatory.net/trackback/6

건전한 댓글 문화를 만들어주시기 바랍니다 ^^
불건전한 댓글이 등록되는 경우 관리자의 임의적 판단으로 삭제될 수 있음을 미리 공지드립니다.

비밀글로 작성하기
  1. 초보 개발자
    초보 개발자
    2016/10/27 22:53
    좋은 자료 감사드립니다 !!