복붙노트

PHP에서 디렉토리와 그 전체 내용 (파일 + 하위 디렉토리)을 재귀 적으로 삭제하는 방법은 무엇입니까?

PHP

PHP에서 디렉토리와 그 전체 내용 (파일 + 하위 디렉토리)을 재귀 적으로 삭제하는 방법은 무엇입니까?

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

해결법

  1. ==============================

    1.rmdir의 맨 페이지에있는 첫 번째 메모를 해봤습니까?

    rmdir의 맨 페이지에있는 첫 번째 메모를 해봤습니까?

     function rrmdir($dir) { 
       if (is_dir($dir)) { 
         $objects = scandir($dir); 
         foreach ($objects as $object) { 
           if ($object != "." && $object != "..") { 
             if (is_dir($dir."/".$object))
               rrmdir($dir."/".$object);
             else
               unlink($dir."/".$object); 
           } 
         }
         rmdir($dir); 
       } 
     }
    
  2. ==============================

    2.Pixel Developer의 의견을 바탕으로 SPL을 사용하는 스 니펫은 다음과 같습니다.

    Pixel Developer의 의견을 바탕으로 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가 부모 (폴더)보다 먼저 자식 (파일)을 반복하는 데 사용된다는 것입니다.

  3. ==============================

    3.경로의 모든 파일과 폴더를 삭제합니다.

    경로의 모든 파일과 폴더를 삭제합니다.

    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);
    }
    
  4. ==============================

    4.* nix의 경우 Windows의 경우 rm -R 또는 DEL / S folder_name에 shell_exec를 사용할 수 있습니다.

    * nix의 경우 Windows의 경우 rm -R 또는 DEL / S folder_name에 shell_exec를 사용할 수 있습니다.

  5. ==============================

    5.더 많은 예제가있는 또 다른 스레드가 있습니다. 재귀 PHP를위한 디렉토리 기능 제거?

    더 많은 예제가있는 또 다른 스레드가 있습니다. 재귀 PHP를위한 디렉토리 기능 제거?

    Yii를 사용한다면 프레임 워크에 그대로 둘 수 있습니다.

    CFileHelper::removeDirectory($my_directory);
    
  6. ==============================

    6.

    <?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;
    }
    
  7. ==============================

    7.10 년 된 사람이 읽을 수있는 '간단한'코드 :

    10 년 된 사람이 읽을 수있는 '간단한'코드 :

    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);
        }
    }
    

    내가 한 모든 일은 확장 / 단순화 및 수정 (비어 있지 않은 Dir에서는 작동하지 않음) 해결책을 여기에 적었습니다. PHP에서는 어떻게 비어 있지 않은 모든 폴더를 재귀 적으로 제거합니까?

  8. ==============================

    8.이 같은?

    이 같은?

    function delete_folder($folder) {
        $glob = glob($folder);
        foreach ($glob as $g) {
            if (!is_dir($g)) {
                unlink($g);
            } else {
                delete_folder("$g/*");
                rmdir($g);
            }
        }
    }
    
  9. ==============================

    9.향상된 @Artefacto의 솔루션 - 빈 오타 & 비어 있지 않은 디렉토리 모두에서 작동하는 수정 된 오타 및 단순 코드.

    향상된 @Artefacto의 솔루션 - 빈 오타 & 비어 있지 않은 디렉토리 모두에서 작동하는 수정 된 오타 및 단순 코드.

      function recursive_rmdir($dir) { 
        if( is_dir($dir) ) { 
          $objects = array_diff( scandir($dir), array('..', '.') );
          foreach ($objects as $object) { 
            $objectPath = $dir."/".$object;
            if( is_dir($objectPath) )
              recursive_rmdir($objectPath);
            else
              unlink($objectPath); 
          } 
          rmdir($dir); 
        } 
      }
    
  10. ==============================

    10.unlinkr 함수는 스크립트 자체를 삭제하지 않음으로써 주어진 경로의 모든 폴더와 파일을 재귀 적으로 삭제합니다.

    unlinkr 함수는 스크립트 자체를 삭제하지 않음으로써 주어진 경로의 모든 폴더와 파일을 재귀 적으로 삭제합니다.

    function unlinkr($dir, $pattern = "*") {
        // find all files and folders matching pattern
        $files = glob($dir . "/$pattern"); 
    
        //interate thorugh the files and folders
        foreach($files as $file){ 
        //if it is a directory then re-call unlinkr function to delete files inside this directory     
            if (is_dir($file) and !in_array($file, array('..', '.')))  {
                echo "<p>opening directory $file </p>";
                unlinkr($file, $pattern);
                //remove the directory itself
                echo "<p> deleting directory $file </p>";
                rmdir($file);
            } else if(is_file($file) and ($file != __FILE__)) {
                // make sure you don't delete the current script
                echo "<p>deleting file $file </p>";
                unlink($file); 
            }
        }
    }
    

    이 스크립트를 배치 할 모든 파일과 폴더를 삭제하려면 다음과 같이 호출하십시오

    //get current working directory
    $dir = getcwd();
    unlinkr($dir);
    

    PHP 파일 만 삭제하려면 다음과 같이 호출하십시오.

    unlinkr($dir, "*.php");
    

    다른 경로를 사용하여 파일을 삭제할 수 있습니다.

    unlinkr("/home/user/temp");
    

    이렇게하면 home / user / temp 디렉토리의 모든 파일이 삭제됩니다.

  11. ==============================

    11.테스트를 마친 후에는 #unlink와 #rmdir에서 #을 제거하십시오.

    테스트를 마친 후에는 #unlink와 #rmdir에서 #을 제거하십시오.

    <?php 
    class RMRFiles {
    
            function __construct(){
            }
    
        public function recScan( $mainDir, $allData = array() )
        {
    
        // hide files
        $hidefiles = array(
        ".",
        "..") ;
    
        //start reading directory
        $dirContent = scandir( $mainDir ) ;
    
            //cycle through
            foreach ( $dirContent as $key => $content )
            {
                $path = $mainDir . '/' . $content ;
    
                // if is readable / file
                if ( ! in_array( $content, $hidefiles ) )
                {
                if ( is_file( $path ) && is_readable( $path ) )
                {
                #delete files within directory
                #unlink($path);
                $allData['unlink'][] = $path ;
                }
    
                // if is readable / directory
                else
                if ( is_dir( $path ) && is_readable( $path ) )
                {
                /*recursive*/
                $allData = $this->recScan( $path, $allData ) ;
    
                #finally remove directory
                $allData['rmdir'][]=$path;
                #rmdir($path);
                }
                }
            }
    
        return $allData ;
    
        }
    
    }
    
    header("Content-Type: text/plain");
    
    /* Get absolute path of the running script 
    Ex : /home/user/public_html/   */
    define('ABPATH', dirname(__file__) . '/'); 
    
    /* The folder where we store cache files 
    Ex: /home/user/public_html/var/cache   */
    define('STOREDIR','var/cache'); 
    
    $rmrf = new RMRFiles();
    #here we delete folder content files & directories
    print_r($rmrf->recScan(ABPATH.STOREDIR));
    #finally delete scanned directory ? 
    #rmdir(ABPATH.STOREDIR);
    
    ?>
    
  12. ==============================

    12.

    <?php
    
    /**
     * code by Nk (nk.have.a@gmail.com)
     */
    
    class filesystem
    {
        public static function remove($path)
        {
            return is_dir($path) ? rmdir($path) : unlink($path);
        }
    
        public static function normalizePath($path)
        {
            return $path.(is_dir($path) && !preg_match('@/$@', $path) ? '/' : '');      
        }
    
        public static function rscandir($dir, $sort = SCANDIR_SORT_ASCENDING)
        {
            $results = array();
    
            if(!is_dir($dir))
            return $results;
    
            $dir = self::normalizePath($dir);
    
            $objects = scandir($dir, $sort);
    
            foreach($objects as $object)
            if($object != '.' && $object != '..')
            {
                if(is_dir($dir.$object))
                $results = array_merge($results, self::rscandir($dir.$object, $sort));
                else
                array_push($results, $dir.$object);
            }
    
            array_push($results, $dir);
    
            return $results;
        }
    
        public static function rrmdir($dir)
        {
            $files = self::rscandir($dir);
    
            foreach($files as $file)
            self::remove($file);
    
            return !file_exists($dir);
        }
    }
    
    ?>
    

    cleanup.php :

    <?php
    
    /* include.. */
    
    filesystem::rrmdir('/var/log');
    filesystem::rrmdir('./cache');
    
    ?>
    
  13. ==============================

    13.100 % 작동 솔루션

    100 % 작동 솔루션

    public static function rmdir_recursive($directory, $delete_parent = null)
      {
        $files = glob($directory . '/{,.}[!.,!..]*',GLOB_MARK|GLOB_BRACE);
        foreach ($files as $file) {
          if (is_dir($file)) {
            self::rmdir_recursive($file, 1);
          } else {
            unlink($file);
          }
        }
        if ($delete_parent) {
          rmdir($directory);
        }
      }
    
  14. ==============================

    14.StackOverflow 토론에서이 코드를 만들었습니다. 나는 아직 리눅스 환경에서 테스트하지 않았다. 파일이나 디렉토리를 완전히 삭제하기 위해 만들어졌습니다 :

    StackOverflow 토론에서이 코드를 만들었습니다. 나는 아직 리눅스 환경에서 테스트하지 않았다. 파일이나 디렉토리를 완전히 삭제하기 위해 만들어졌습니다 :

    function splRm(SplFileInfo $i)
    {
        $path = $i->getRealPath();
    
        if ($i->isDir()) {
            echo 'D - ' . $path . '<br />';
            rmdir($path);
        } elseif($i->isFile()) {
            echo 'F - ' . $path . '<br />';
            unlink($path);
        }
    }
    
    function splRrm(SplFileInfo $j)
    {
        $path = $j->getRealPath();
    
        if ($j->isDir()) {
            $rdi = new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS);
            $rii = new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::CHILD_FIRST);
            foreach ($rii as $i) {
                splRm($i);
            }
        }
        splRm($j);
    
    }
    
    splRrm(new SplFileInfo(__DIR__.'/../dirOrFileName'));
    
  15. ==============================

    15.

    function rmdir_recursive( $dirname ) {
    
        /**
         * FilesystemIterator and SKIP_DOTS
         */
    
        if ( class_exists( 'FilesystemIterator' ) && defined( 'FilesystemIterator::SKIP_DOTS' ) ) {
    
            if ( !is_dir( $dirname ) ) {
                return false;
            }
    
            foreach( new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dirname, FilesystemIterator::SKIP_DOTS ), RecursiveIteratorIterator::CHILD_FIRST ) as $path ) {
                $path->isDir() ? rmdir( $path->getPathname() ) : unlink( $path->getRealPath() );
            }
    
            return rmdir( $dirname );
    
        }
    
        /**
         * RecursiveDirectoryIterator and SKIP_DOTS
         */
    
        if ( class_exists( 'RecursiveDirectoryIterator' ) && defined( 'RecursiveDirectoryIterator::SKIP_DOTS' ) ) {
    
            if ( !is_dir( $dirname ) ) {
                return false;
            }
    
            foreach( new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dirname, RecursiveDirectoryIterator::SKIP_DOTS ), RecursiveIteratorIterator::CHILD_FIRST ) as $path ) {
                $path->isDir() ? rmdir( $path->getPathname() ) : unlink( $path->getRealPath() );
            }
    
            return rmdir( $dirname );
    
        }
    
        /**
         * RecursiveIteratorIterator and RecursiveDirectoryIterator
         */
    
        if ( class_exists( 'RecursiveIteratorIterator' ) && class_exists( 'RecursiveDirectoryIterator' ) ) {
    
            if ( !is_dir( $dirname ) ) {
                return false;
            }
    
            foreach( new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dirname ), RecursiveIteratorIterator::CHILD_FIRST ) as $path ) {
                if ( in_array( $path->getFilename(), array( '.', '..' ) ) ) {
                    continue;
                }
                $path->isDir() ? rmdir( $path->getPathname() ) : unlink( $path->getRealPath() );
            }
    
            return rmdir( $dirname );
    
        }
    
        /**
         * Scandir Recursive
         */
    
        if ( !is_dir( $dirname ) ) {
            return false;
        }
    
        $objects = scandir( $dirname );
    
        foreach ( $objects as $object ) {
            if ( $object === '.' || $object === '..' ) {
                continue;
            }
            filetype( $dirname . DIRECTORY_SEPARATOR . $object ) === 'dir' ? rmdir_recursive( $dirname . DIRECTORY_SEPARATOR . $object ) : unlink( $dirname . DIRECTORY_SEPARATOR . $object );
        }
    
        reset( $objects );
        rmdir( $dirname );
    
        return !is_dir( $dirname );
    
    }
    
  16. ==============================

    16.glob () 함수를 사용한 예제. 점으로 시작하는 파일을 포함하여 모든 파일과 폴더를 반복적으로 삭제합니다.

    glob () 함수를 사용한 예제. 점으로 시작하는 파일을 포함하여 모든 파일과 폴더를 반복적으로 삭제합니다.

    delete_all( 'folder' );
    
    function delete_all( $item ) {
        if ( is_dir( $item ) ) {
            array_map( 'delete_all', array_diff( glob( "$item/{,.}*", GLOB_BRACE ), array( "$item/.", "$item/.." ) ) );
            rmdir( $item );
        } else {
            unlink( $item );
        }
    };
    
  17. ==============================

    17.@XzaR 솔루션의 변형 된 변형. 빈 폴더는 모든 파일이 삭제 될 때 제거되며 오류시 false를 반환하는 대신 예외를 throw합니다.

    @XzaR 솔루션의 변형 된 변형. 빈 폴더는 모든 파일이 삭제 될 때 제거되며 오류시 false를 반환하는 대신 예외를 throw합니다.

    function recursivelyRemoveDirectory($source, $removeOnlyChildren = true)
    {
        if (empty($source) || file_exists($source) === false) {
            throw new Exception("File does not exist: '$source'");
        }
    
        if (is_file($source) || is_link($source)) {
            if (false === unlink($source)) {
                throw new Exception("Cannot delete file '$source'");
            }
        }
    
        $files = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
            RecursiveIteratorIterator::CHILD_FIRST
        );
    
        foreach ($files as $fileInfo) {
            /** @var SplFileInfo $fileInfo */
            if ($fileInfo->isDir()) {
                if ($this->recursivelyRemoveDirectory($fileInfo->getRealPath()) === false) {
                    throw new Exception("Failed to remove directory '{$fileInfo->getRealPath()}'");
                }
                if (false === rmdir($fileInfo->getRealPath())) {
                    throw new Exception("Failed to remove empty directory '{$fileInfo->getRealPath()}'");
                }
            } else {
                if (unlink($fileInfo->getRealPath()) === false) {
                    throw new Exception("Failed to remove file '{$fileInfo->getRealPath()}'");
                }
            }
        }
    
        if ($removeOnlyChildren === false) {
            if (false === rmdir($source)) {
                throw new Exception("Cannot remove directory '$source'");
            }
        }
    }
    
  18. ==============================

    18.

    function deltree_cat($folder)
    {
        if (is_dir($folder))
        {
                 $handle = opendir($folder);
                 while ($subfile = readdir($handle))
                 {
                         if ($subfile == '.' or $subfile == '..') continue;
                         if (is_file($subfile)) unlink("{$folder}/{$subfile}");
                         else deltree_cat("{$folder}/{$subfile}");
                 }
                 closedir($handle);
                 rmdir ($folder);
         }
         else
         {
            unlink($folder);
         }
    }
    
  19. ==============================

    19.나는이 코드를 사용한다 ...

    나는이 코드를 사용한다 ...

     function rmDirectory($dir) {
            foreach(glob($dir . '/*') as $file) {
                if(is_dir($file))
                    rrmdir($file);
                else
                    unlink($file);
            }
            rmdir($dir);
        }
    

    또는이 하나 ...

    <?php 
    public static function delTree($dir) { 
       $files = array_diff(scandir($dir), array('.','..')); 
        foreach ($files as $file) { 
          (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file"); 
        } 
        return rmdir($dir); 
      } 
    ?>
    
  20. from https://stackoverflow.com/questions/3338123/how-do-i-recursively-delete-a-directory-and-its-entire-contents-files-sub-dir by cc-by-sa and MIT license