PHP에서 디렉토리와 그 전체 내용 (파일 및 하위 디렉토리)을 어떻게 삭제합니까?
답변
매뉴얼 페이지의 사용자 제공 섹션 rmdir
에는 적절한 구현 이 포함되어 있습니다.
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (is_dir($dir. DIRECTORY_SEPARATOR .$object) && !is_link($dir."/".$object))
rrmdir($dir. DIRECTORY_SEPARATOR .$object);
else
unlink($dir. DIRECTORY_SEPARATOR .$object);
}
}
rmdir($dir);
}
}
답변
Pixel 개발자의 의견을 바탕으로 SPL을 사용하는 스 니펫은 다음과 같습니다.
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach ($files as $fileinfo) {
$todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
$todo($fileinfo->getRealPath());
}
rmdir($dir);
참고 : 온 전성 검사 는 없으며 PHP 5.3.0의 FilesystemIterator에 도입 된 SKIP_DOTS 플래그를 사용합니다. 물론 / 일 $todo
수 있습니다 . 중요한 점은 부모 (폴더)보다 먼저 자식 (파일)을 반복하는 데 사용됩니다.if
else
CHILD_FIRST
답변
경로의 모든 파일과 폴더를 삭제합니다.
function recurseRmdir($dir) {
$files = array_diff(scandir($dir), array('.','..'));
foreach ($files as $file) {
(is_dir("$dir/$file")) ? recurseRmdir("$dir/$file") : unlink("$dir/$file");
}
return rmdir($dir);
}
답변
* nix의 경우 shell_exec
for rm -R
또는 DEL /S folder_name
Windows 를 사용할 수 있습니다 .
답변
<?php
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use SplFileInfo;
# http://stackoverflow.com/a/3352564/283851
# https://gist.github.com/XzaR90/48c6b615be12fa765898
# Forked from https://gist.github.com/mindplay-dk/a4aad91f5a4f1283a5e2
/**
* Recursively delete a directory and all of it's contents - e.g.the equivalent of `rm -r` on the command-line.
* Consistent with `rmdir()` and `unlink()`, an E_WARNING level error will be generated on failure.
*
* @param string $source absolute path to directory or file to delete.
* @param bool $removeOnlyChildren set to true will only remove content inside directory.
*
* @return bool true on success; false on failure
*/
function rrmdir($source, $removeOnlyChildren = false)
{
if(empty($source) || file_exists($source) === false)
{
return false;
}
if(is_file($source) || is_link($source))
{
return unlink($source);
}
$files = new RecursiveIteratorIterator
(
new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::CHILD_FIRST
);
//$fileinfo as SplFileInfo
foreach($files as $fileinfo)
{
if($fileinfo->isDir())
{
if(rrmdir($fileinfo->getRealPath()) === false)
{
return false;
}
}
else
{
if(unlink($fileinfo->getRealPath()) === false)
{
return false;
}
}
}
if($removeOnlyChildren === false)
{
return rmdir($source);
}
return true;
}
답변
더 많은 예제를 가진 또 다른 스레드가 있습니다 :
PHP의 재귀 디렉토리 제거 기능?
Yii를 사용하는 경우 프레임 워크에 그대로 둘 수 있습니다.
CFileHelper::removeDirectory($my_directory);
답변
작동하고 열 살짜리가 읽을 수있는 ‘간단한’코드 :
function deleteNonEmptyDir($dir)
{
if (is_dir($dir))
{
$objects = scandir($dir);
foreach ($objects as $object)
{
if ($object != "." && $object != "..")
{
if (filetype($dir . "/" . $object) == "dir")
{
deleteNonEmptyDir($dir . "/" . $object);
}
else
{
unlink($dir . "/" . $object);
}
}
}
reset($objects);
rmdir($dir);
}
}
내가 한 모든 것은 확장 / 단순화 및 수정 (빈 디렉토리가 아닌 경우 작동하지 않음)입니다
.PHP에서 비어 있지 않은 모든 폴더를 재귀 적으로 제거하는 방법은 무엇입니까?