Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP: glob과 재귀 호출로 디렉토리 내 모든 파일 삭제 후 디렉토리 제거하기

PHP로 디렉토리 내부 전체 삭제하기

PHP에서 rmdir() 함수는 비어 있는 디렉토리만 삭제할 수 있습니다. 따라서 디렉토리 자체를 지우기 전에 내부의 모든 파일과 하위 디렉토리를 먼저 비워야 합니다.

glob으로 패턴에 맞는 모든 파일 찾기

glob 함수를 사용하면 특정 패턴과 일치하는 모든 파일 경로를 배열로 가져올 수 있습니다. 이를 재귀 함수와 조합하면 중첩된 하위 디렉토리까지 한 번에 정리할 수 있습니다.

function recursive_directory_removal($directory) {
    foreach(glob("{$directory}/*") as $file) {
        if(is_dir($file)) {
            recursive_directory_removal($file);
        } else {
            unlink($file);
        }
    }
    rmdir($directory);
}

동작 방식

  • glob("{$directory}/*"): 해당 디렉토리 안의 모든 항목(파일·폴더) 목록을 가져옵니다.
  • is_dir($file): 항목이 디렉토리인지 확인합니다.
  • 디렉토리라면 자기 자신을 다시 호출(재귀)하여 내부를 먼저 비웁니다.
  • 파일이라면 unlink()로 삭제합니다.
  • 루프가 끝나면 비어 있게 된 디렉토리를 rmdir()로 제거합니다.

PHP 5.3 이상에서 간결하게 처리하기

PHP 5.3부터는 익명 함수(클로저)를 사용할 수 있으므로, array_walk와 조합하면 더 짧은 코드로 작성할 수 있습니다.

$dir = ...
array_walk(glob($dir . '/*'), function ($fn) {
    if (is_file($fn))
        unlink($fn);
});
rmdir($dir);

이 코드는 지정한 디렉토리 바로 아래의 파일만 삭제합니다. 하위 디렉토리가 존재하면 마지막 rmdir()이 실패하므로, 하위 폴더까지 완전히 삭제하려면 앞서 소개한 재귀 함수를 사용하는 것이 안전합니다.

주의 사항

  • 재귀 삭제는 되돌릴 수 없으므로 실행 전에 대상 경로를 반드시 확인하세요.
  • .htaccess, .git처럼 점(.)으로 시작하는 숨김 파일은 기본 glob("*") 패턴에 포함되지 않으므로 필요 시 별도 처리가 필요합니다.
  • 파일 시스템 권한 문제로 삭제가 실패할 수 있으니, unlink()rmdir()의 반환값을 검증하는 습관이 좋습니다.