[php] 파일이있는 디렉토리를 삭제 하시겠습니까?

모든 파일이 들어있는 디렉토리를 삭제하는 가장 쉬운 방법은 무엇입니까?

rmdir(PATH . '/' . $value);폴더를 삭제하는 데 사용 하고 있지만 폴더 안에 파일이 있으면 삭제할 수 없습니다.



답변

요즘에는 두 가지 이상의 옵션이 있습니다.

  1. 폴더를 삭제하기 전에 모든 파일과 폴더를 삭제하십시오 (이것은 재귀를 의미합니다!). 예를 들면 다음과 같습니다.

    public static function deleteDir($dirPath) {
        if (! is_dir($dirPath)) {
            throw new InvalidArgumentException("$dirPath must be a directory");
        }
        if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
            $dirPath .= '/';
        }
        $files = glob($dirPath . '*', GLOB_MARK);
        foreach ($files as $file) {
            if (is_dir($file)) {
                self::deleteDir($file);
            } else {
                unlink($file);
            }
        }
        rmdir($dirPath);
    }
  2. 5.2 이상을 사용하는 경우 재귀를 직접 구현하지 않고도 RecursiveIterator를 사용하여 수행 할 수 있습니다.

    $dir = 'samples' . DIRECTORY_SEPARATOR . 'sampledirtree';
    $it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
    $files = new RecursiveIteratorIterator($it,
                 RecursiveIteratorIterator::CHILD_FIRST);
    foreach($files as $file) {
        if ($file->isDir()){
            rmdir($file->getRealPath());
        } else {
            unlink($file->getRealPath());
        }
    }
    rmdir($dir);

답변

나는 일반적으로 이것을 사용하여 폴더의 모든 파일을 삭제합니다.

array_map('unlink', glob("$dirname/*.*"));

그리고 당신은 할 수 있습니다

rmdir($dirname);


답변

파일이 들어있는 디렉토리를 삭제하는 가장 쉬운 방법은 무엇입니까?

system("rm -rf ".escapeshellarg($dir));


답변

일을하는 짧은 기능 :

function deleteDir($path) {
    return is_file($path) ?
            @unlink($path) :
            array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}

다음과 같이 Utils 클래스에서 사용합니다.

class Utils {
    public static function deleteDir($path) {
        $class_func = array(__CLASS__, __FUNCTION__);
        return is_file($path) ?
                @unlink($path) :
                array_map($class_func, glob($path.'/*')) == @rmdir($path);
    }
}

큰 힘을 가지고 큰 책임을집니다 . 빈 값으로이 함수를 호출하면 루트 ( /)로 시작하는 파일이 삭제됩니다 . 안전을 위해 경로가 비어 있는지 확인할 수 있습니다.

function deleteDir($path) {
    if (empty($path)) {
        return false;
    }
    return is_file($path) ?
            @unlink($path) :
            array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}


답변

PHP 매뉴얼 페이지에 대한 대부분의 투표에서 알 수 있듯이 rmdir()( http://php.net/manual/es/function.rmdir.php 참조 ), glob()함수는 숨겨진 파일을 반환하지 않습니다. scandir()이 문제를 해결하는 대안으로 제공됩니다.

거기에 설명 된 알고리즘 (제 경우에는 매력처럼 작동했습니다)은 다음과 같습니다.

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


답변

이것은 짧은 버전입니다 나에게 잘 작동합니다

function deleteDirectory($dirPath) {
    if (is_dir($dirPath)) {
        $objects = scandir($dirPath);
        foreach ($objects as $object) {
            if ($object != "." && $object !="..") {
                if (filetype($dirPath . DIRECTORY_SEPARATOR . $object) == "dir") {
                    deleteDirectory($dirPath . DIRECTORY_SEPARATOR . $object);
                } else {
                    unlink($dirPath . DIRECTORY_SEPARATOR . $object);
                }
            }
        }
    reset($objects);
    rmdir($dirPath);
    }
}


답변

Symfony ‘s Filesystem ( code )을 사용할 수 있습니다 :

// composer require symfony/filesystem

use Symfony\Component\Filesystem\Filesystem;

(new Filesystem)->remove($dir);

그러나이 방법으로 복잡한 디렉토리 구조를 삭제할 수 없으므로 먼저 제대로 작동하는지 확인해야합니다.

Windows 특정 구현을 사용하여 상기 디렉토리 구조를 삭제할 수 있습니다.

$dir = strtr($dir, '/', '\\');
// quotes are important, otherwise one could
// delete "foo" instead of "foo bar"
system('RMDIR /S /Q "'.$dir.'"');

그리고 완전성을 위해 여기에 오래된 코드가 있습니다.

function xrmdir($dir) {
    $items = scandir($dir);
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') {
            continue;
        }
        $path = $dir.'/'.$item;
        if (is_dir($path)) {
            xrmdir($path);
        } else {
            unlink($path);
        }
    }
    rmdir($dir);
}