본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP rmdir() — 빈 폴더 삭제 · is_dir 체크 · 재귀 삭제 완전 정리

by 왕진 2026. 7. 11.
반응형

 

 

Web Development · PHP 파일 시스템 함수

PHP rmdir() — 빈 디렉토리를 삭제하는 함수

is_dir 체크 · 비어 있어야 삭제 가능 · 재귀 삭제 구현 완전 정리
시작 오늘 분석할 코드

rmdir()는 비어 있는 디렉토리를 삭제하는 함수입니다. 핵심 제약은 "비어 있어야만" 삭제된다는 점입니다. 내부에 파일이나 하위 디렉토리가 있으면 실패합니다. is_dir()로 대상이 디렉토리인지 확인 후 사용하는 것이 안전합니다.

<?php if (is_dir("temp") && rmdir("temp")) { // is_dir()로 존재+디렉토리 확인 후 // rmdir()로 삭제 시도 — 빈 폴더일 때만 성공 print "temp 폴더를 삭제했습니다."; } else { print "삭제할 수 없습니다. (없거나 비어 있지 않음)"; } ?>
실제 출력 미리보기
temp 존재 + 비어 있음
temp 폴더를 삭제했습니다.
없거나 파일이 있음
삭제할 수 없습니다.
용어 용어 정리
rmdir($path)빈 디렉토리 삭제. 성공 true / 실패 false 반환
비어 있어야 함파일이나 하위 디렉토리가 있으면 실패. 핵심 제약
is_dir()경로가 디렉토리인지 확인. rmdir 전 체크에 사용
재귀 삭제내용물(파일·하위폴더) 먼저 삭제 후 rmdir — PHP 내장 없음, 직접 구현
unlink()파일 삭제 함수. rmdir 전 디렉토리 내 파일 정리에 사용
mkdir()디렉토리 생성 함수 — rmdir의 반대 작업
glob()디렉토리 내 파일 목록 가져오기 — 재귀 삭제 루프에서 활용
RecursiveIteratorPHP SPL 클래스. 깊은 디렉토리 트리 순회에 적합

1 핵심 제약 — 반드시 비어 있어야 함
내용물이 있으면 rmdir은 항상 실패
// 빈 폴더 → 성공 mkdir("temp"); rmdir("temp"); // true — 성공 // 파일이 있는 폴더 → 실패 mkdir("temp"); file_put_contents("temp/a.txt", "내용"); rmdir("temp"); // false + Warning: rmdir(temp): Directory not empty
⚠️ PHP에는 내용물이 있는 디렉토리를 한 번에 삭제하는 내장 함수가 없습니다. 재귀 삭제 함수를 직접 구현하거나 exec('rm -rf ...') 등을 써야 합니다 — 단, exec는 보안 위험이 있어 신중하게 사용해야 합니다.

2 재귀 삭제 함수 구현
내용물 먼저 삭제 → rmdir 순서
function rmdir_recursive($path) { if (!is_dir($path)) return false; // 내용물 순회 (. .. 제외) foreach (array_diff(scandir($path), ['.', '..']) as $item) { $full = $path . DIRECTORY_SEPARATOR . $item; is_dir($full) ? rmdir_recursive($full) : unlink($full); } return rmdir($path); // 내용물 정리 후 빈 폴더 삭제 } rmdir_recursive("temp_upload");

3 임시 폴더 생성 → 처리 → 삭제 패턴
파일 처리 후 임시 폴더 정리
// 임시 처리 폴더 생성 $tmp_dir = "tmp_" . uniqid(); mkdir($tmp_dir, 0700); // 파일 처리 (예: 압축 해제, 이미지 변환 등) // ... 처리 로직 ... // 처리 완료 후 임시 폴더와 내용물 삭제 foreach (glob($tmp_dir . "/*") as $f) { unlink($f); } rmdir($tmp_dir);

 

반응형

 

4 RecursiveIterator를 활용한 깊은 트리 삭제
PHP SPL — 중첩 깊이 제한 없이 순회
$dir = new RecursiveDirectoryIterator("old_cache", FilesystemIterator::SKIP_DOTS); $iter = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::CHILD_FIRST); // 자식 먼저! foreach ($iter as $item) { $item->isDir() ? rmdir($item) : unlink($item); } rmdir("old_cache");
※ CHILD_FIRST 옵션이 중요합니다 — 자식 디렉토리를 부모보다 먼저 순회해야 rmdir에서 "비어 있지 않음" 오류가 나지 않습니다.

5 30일 이전 임시 디렉토리 일괄 정리
$cutoff = time() - (30 * 86400); foreach (glob("tmp_*", GLOB_ONLYDIR) as $dir) { if (filemtime($dir) < $cutoff) { rmdir_recursive($dir); echo "정리: {$dir}\n"; } }

6 자주 하는 실수
실수 증상 해결
파일이 있는 폴더에 rmdir 바로 사용 Warning: Directory not empty, false 반환 내용물 먼저 unlink/rmdir로 정리 후 rmdir
is_dir 확인 없이 rmdir 호출 파일에 rmdir 쓰면 경고 + false if (is_dir($path) && rmdir($path))
CHILD_FIRST 없이 재귀 순회 후 삭제 자식 디렉토리 삭제 전 부모 삭제 시도 → 실패 RecursiveIteratorIterator::CHILD_FIRST 사용
재귀 삭제 함수에 사용자 입력 경로 직접 사용 경로 순회 공격으로 의도치 않은 삭제 가능 경로 검증·화이트리스트·basename() 처리 후 사용
숨김 파일(., ..)을 순회에서 빠뜨림 scandir 결과에 . .. 포함 — rmdir 실패 array_diff(scandir($p), ['.', '..'])

핵심 한 줄 요약

rmdir($path)빈 디렉토리만 삭제 — 내용물 있으면 반드시 실패
is_dir 패턴if (is_dir($p) && rmdir($p)) — 안전한 삭제 패턴
재귀 삭제내장 없음 — scandir + unlink + rmdir 재귀 함수 직접 구현
CHILD_FIRSTRecursiveIterator 순회 시 자식 먼저 삭제해야 부모 rmdir 성공
보안재귀 삭제에 사용자 입력 경로 그대로 사용 금지 — 경로 검증 필수

Tags

#PHP #rmdir #폴더삭제 #디렉토리삭제 #is_dir #재귀삭제 #unlink #PHP파일함수 #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, rmdir, 폴더삭제, 디렉토리삭제, is_dir, 재귀삭제, unlink, PHP파일함수, PHP함수, PHP학습, 웹개발, 티스토리
반응형

댓글