PHP에서 디렉토리와 그 전체 내용 (파일 + 하위 디렉토리)을 재귀 적으로 삭제하려면 어떻게합니까? PHP에서 디렉토리와 그 전체

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수 있습니다 . 중요한 점은 부모 (폴더)보다 먼저 자식 (파일)을 반복하는 데 사용됩니다.ifelseCHILD_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_execfor rm -R또는 DEL /S folder_nameWindows 를 사용할 수 있습니다 .


답변

<?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에서 비어 있지 않은 모든 폴더를 재귀 적으로 제거하는 방법은 무엇입니까?