如何在PHP中刪除目錄及其全部內容(文件和子目錄)?如何在PHP中遞歸刪除目錄及其全部內容(文件+子目錄)?
回答
您是否嘗試過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);
}
}
@Pixel開發人員 - 我添加了[答案](http://stackoverflow.com/questions/3338123/how-do-i-recursively-delete-a-directory-and-its-全內容文件子目錄/ 3352564#3352564)。 – salathe 2010-07-28 11:58:51
查看有人給我的相同問題的解決方案:glob似乎工作更好:http://stackoverflow.com/questions/11267086/php-unlink-all-files-withing-a-directory-and-then-deleting -that-directory – 2012-08-10 17:09:53
謝謝你的回答,但reset()在這裏沒用,你應該使用is_dir();-)(就像你在第2行那樣)。 – Loenix 2014-04-30 12:39:44
對於* nix中您可以使用rm -R
爲Windows shell_exec
或DEL /S folder_name
。
不會在windows上工作 – Gordon 2010-07-27 07:00:52
如何爲Windows的DEL/S文件夾名稱 – ankitjaininfo 2010-10-21 08:50:02
如果您有安全意識,這不是一件好事 – WiR3D 2016-03-14 14:50:50
大廈The Pixel Developer's comment,採用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
用於在其父(文件夾)之前首先迭代子文件(文件)。
只有SKIP_DOTS被引入在PHP 5.3中?你在哪裏看到的? – 2011-05-31 17:48:11
@Alix Axel,[r263239](http://svn.php.net/viewvc/?view=revision&revision=263239) – salathe 2011-05-31 17:56:11
謝謝。另外:你不應該使用'getPathname()'方法而不是'getRealPath()'? – 2011-06-01 08:19:14
是這樣的嗎?
function delete_folder($folder) {
$glob = glob($folder);
foreach ($glob as $g) {
if (!is_dir($g)) {
unlink($g);
} else {
delete_folder("$g/*");
rmdir($g);
}
}
}
我無法解釋爲什麼,但這並不適合我。它一直試圖刪除一個非空的文件夾。上面的第二個答案很好。 – 2014-01-10 15:19:47
@ buggy3你指的是哪個特定的代碼?鏈接只是鏈接到這個問題頁面。 – cgogolin 2017-04-25 13:58:04
「簡單」的代碼工作,並且可以通過一個十歲閱讀:
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)解決方案: In PHP how do I recursively remove all folders that aren't empty?
刪除路徑中的所有文件和文件夾。
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);
}
還有更多的例子在這裏另一個線程: A recursive remove directory function for PHP?
如果您正在使用Yii,那麼你可以將它留給框架:
CFileHelper::removeDirectory($my_directory);
我中庸之道使這個代碼,從一些StackOverflow討論。我還沒有在Linux環境下測試。這是爲了刪除一個文件或目錄製作,完全:
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'));
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);
}
例與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);
}
};
我用'system 'rm -fr文件夾')' – 2015-03-25 22:49:33
<?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;
}
改性的@XzaR溶液變體。它會刪除空文件夾,當所有文件都從中刪除時,它會拋出異常而不是返回錯誤。
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'");
}
}
}
增強@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);
}
}
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目錄中的所有文件。
我使用此代碼...
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);
}
?>
這是遞歸嗎? – Carpetsmoker 2016-03-25 11:30:11
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);
}
}
如果您回答的問題已經有很多答案,包括已被接受的答案,您需要發佈解答,您的答案增加了什麼價值,而不僅僅是代碼。一般來說,僅有代碼的答案是不受歡迎的,但尤其是這種情況。 – 2016-07-14 15:30:12
我投了這個答案並接受了答案。從我的基準檢查(沒有'unlink','rmdir')來看,'opendir' +'readdir'工作得更快,scandir和RecursiveDirectoryIterator的使用也比所有內存少。要刪除文件夾,我必須先「封閉」,我被困在此處。感謝這個答案。 – vee 2017-05-30 13:43:30
一旦您完成運行測試,只是刪除#從#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);
?>
<?php
/**
* code by Nk ([email protected])
*/
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('@/[email protected]', $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');
?>
- 1. Codeigniter刪除目錄及其內容
- 2. PHP函數刪除目錄及其所有子內容。
- 3. 如何在c目錄及其子目錄中搜索文件?
- 4. 遞歸遍歷目錄及其子目錄中的所有文件Qt
- 5. SCP目錄和文件的內容,但不包括子目錄及其內容
- 6. 重定向目錄的內容,Nginx目錄本身及其部分子目錄和文件除外
- 7. 如何從當前目錄及其子目錄刪除特定文件?
- 8. 如何限制在PHP中訪問目錄及其子目錄?
- 9. emacs遞歸刪除目錄?
- 10. 遞歸刪除目錄
- 11. 遞歸地刪除目錄
- 12. 遞歸刪除目錄
- 13. 刪除Unix中的遞歸目錄(無限子目錄)
- 14. 如何使用NSFileManager刪除目錄及其內容
- 15. 如何從當前目錄中刪除文件夾及其所有內容?
- 16. 如何在php中列出目錄及其子目錄的所有文件?
- 17. 刪除目錄內容和子目錄內容
- 18. 在PowerShell中刪除目錄對象及其內容
- 19. 如何從Unix命令行遞歸地解壓目錄及其子目錄中的歸檔文件?
- 20. 國防部重寫.PHP在目錄及其子目錄只
- 21. 保持目錄和所有子目錄遞歸除了文件
- 22. 如何刪除一個目錄遞歸
- 23. PHP - FTP子目錄遞歸?
- 24. 創建目錄。如果存在,刪除目錄及其內容並在Java中創建一個新的文件
- 25. 遞歸鎖定或解鎖目錄及其內容
- 26. 如何在gradle war中排除目錄及其內容
- 27. 刪除目錄及其所有子目錄
- 28. 如何用C++刪除目錄及其中的所有文件?
- 29. 在內部,如何刪除目錄的內容,但不是目錄本身?
- 30. 刪除目錄及所有文件中
的可能重複(http://stackoverflow.com/questions/3349753/delete-directory-with -files-in-it) – 2014-11-26 09:10:37