PHP에서 디렉토리와 그 전체 내용 (파일 + 하위 디렉토리)을 재귀 적으로 삭제하는 방법은 무엇입니까?
PHPPHP에서 디렉토리와 그 전체 내용 (파일 + 하위 디렉토리)을 재귀 적으로 삭제하는 방법은 무엇입니까?
PHP에서 디렉토리와 그 전체 내용 (파일 및 하위 디렉토리)을 삭제하려면 어떻게합니까?
해결법
-
==============================
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.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.경로의 모든 파일과 폴더를 삭제합니다.
경로의 모든 파일과 폴더를 삭제합니다.
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.* nix의 경우 Windows의 경우 rm -R 또는 DEL / S folder_name에 shell_exec를 사용할 수 있습니다.
* nix의 경우 Windows의 경우 rm -R 또는 DEL / S folder_name에 shell_exec를 사용할 수 있습니다.
-
==============================
5.더 많은 예제가있는 또 다른 스레드가 있습니다. 재귀 PHP를위한 디렉토리 기능 제거?
더 많은 예제가있는 또 다른 스레드가 있습니다. 재귀 PHP를위한 디렉토리 기능 제거?
Yii를 사용한다면 프레임 워크에 그대로 둘 수 있습니다.
CFileHelper::removeDirectory($my_directory);
-
==============================
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.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.이 같은?
이 같은?
function delete_folder($folder) { $glob = glob($folder); foreach ($glob as $g) { if (!is_dir($g)) { unlink($g); } else { delete_folder("$g/*"); rmdir($g); } } }
-
==============================
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.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.테스트를 마친 후에는 #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.
<?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.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.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.
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.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.@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.
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.나는이 코드를 사용한다 ...
나는이 코드를 사용한다 ...
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); } ?>
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
'PHP' 카테고리의 다른 글
"치명적인 오류 : PHP의 최대 기능 중첩 수준 '100'도달, 중단 중!" (0) | 2018.09.13 |
---|---|
PHP : mysql_real_escape_string은 사용자 입력을 청소하기에 충분합니까? (0) | 2018.09.13 |
HTTP POST를 사용하여 HTML 및 PHP로 여러 파일을 선택하고 업로드하려면 어떻게합니까? (0) | 2018.09.13 |
PHP는 연령 계산 (0) | 2018.09.13 |
URL 쿼리 문자열 가져 오기 (0) | 2018.09.13 |