কীভাবে আমি পিএইচপি-তে কোনও ডিরেক্টরি এবং এর সম্পূর্ণ বিষয়বস্তু (ফাইল এবং উপ-ডিরেক্টরি) মুছব?
কীভাবে আমি পিএইচপি-তে কোনও ডিরেক্টরি এবং এর সম্পূর্ণ বিষয়বস্তু (ফাইল এবং উপ-ডিরেক্টরি) মুছব?
উত্তর:
এর ম্যানুয়াল পৃষ্ঠায় ব্যবহারকারী-অবদানের অংশটিতে 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);
}
}
is_dir
প্রতিটি পুনরাবৃত্তি ডিরেক্টরিতে দু'বার কল করে। যদি আর্গুমেন্টটি একটি সিমিলিংক হয় তবে এটি সিমলিংক মোছার পরিবর্তে এটি অনুসরণ করে, যা আপনি যা চান তা হতে পারে বা নাও পারে। যাইহোক, এটি কি rm -rf
করে না।
দ্য পিক্সেল বিকাশকারীর মন্তব্যে বিল্ডিং , এসপিএল ব্যবহার করে একটি স্নিপেট দেখতে দেখতে দেখতে পারা যায়:
$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);
দ্রষ্টব্য: এটি কোনও বিচক্ষণতা যাচাই করে না এবং পিএইচপি 5.3.0-এ ফাইল-সিস্টেমআইট্রেটারের সাথে প্রবর্তিত এসকেআইপি_ডটস পতাকা ব্যবহার করে। অবশ্যই, এটি $todo
একটি if
/ হতে পারে else
। গুরুত্বপূর্ণ পয়েন্টটি হ'ল CHILD_FIRST
বাচ্চাদের (ফাইলগুলি) তাদের পিতামাতার (ফোল্ডার) আগে প্রথমে পুনরাবৃত্তি করতে ব্যবহৃত হয়।
SKIP_DOTS
শুধুমাত্র পিএইচপি 5.3 এ চালু হয়েছিল? তুমি কোথায় দেখলে?
getPathname()
পরিবর্তে পদ্ধতি ব্যবহার করা উচিত নয় getRealPath()
?
rmdir($dir)
স্ক্রিপ্টের শেষে একটি হওয়া উচিত ।
rmdir()
এবং unlink()
যেমন: সাথে অ্যাফোর্ট করে E_WARNING
এবং ফেরত দেয় true
বা false
সাফল্যের ইঙ্গিত দেয়।
FilesystemIterator
কোনও পুনরাবৃত্ত পুনরাবৃত্তিকারী নয়।
পথে সমস্ত ফাইল এবং ফোল্ডার মুছে দেয়।
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);
}
rm -rf /
== recurseRmdir('/')
:)
is_dir("$dir/$file")
করা উচিতis_dir("$dir/$file") && !is_link("$dir/$file")
* নিক্সের জন্য আপনি উইন্ডোজের shell_exec
জন্য rm -R
বা এর DEL /S folder_name
জন্য একটি ব্যবহার করতে পারেন ।
DEL /S folder_name
উইন্ডোজের জন্য কীভাবে
RMDIR /S /Q folder_name
পক্ষে যা কাজ করেছে
exec('rm -rf ' . __DIR__ . '/output/*.log');
<?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;
}
এখানে আরও উদাহরণ সহ আরও একটি থ্রেড রয়েছে: পিএইচপি জন্য একটি পুনরাবৃত্ত ডিরেক্টরি মুছে ফেলা?
আপনি যদি 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);
}
}
দয়া করে মনে রাখবেন যে আমি যা করেছি তা হ'ল সমাধানটি প্রসারিত / সরলকরণ এবং ঠিক করা (খালি দিরের জন্য কাজ করেনি): খালি নয় এমন পিএইচপি-তে আমি কীভাবে পুনরুক্তি করে সমস্ত ফোল্ডার সরিয়ে ফেলব?
উন্নত @ আর্টেফ্যাক্টো'র সমাধান - সংশোধন করা টাইপস এবং সরলিকৃত কোড, উভয়ের জন্য কাজ করছে - খালি && খালি নয় ডিরেক্টরি।
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);
}
}
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);
}
}
এটার মতো কিছু?
function delete_folder($folder) {
$glob = glob($folder);
foreach ($glob as $g) {
if (!is_dir($g)) {
unlink($g);
} else {
delete_folder("$g/*");
rmdir($g);
}
}
}
গ্লোব () ফাংশন সহ উদাহরণ । এটি বিন্দু দিয়ে শুরু হওয়া ফাইলগুলি সহ সমস্ত ফাইল এবং ফোল্ডারগুলি পুনরাবৃত্তভাবে মুছে ফেলবে।
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 folder')
লিঙ্ক-লিঙ্ক ফাংশন পুনরাবৃত্তভাবে নির্দিষ্ট স্ক্রিপ্টটি মুছে দেয় না তা নিশ্চিত করে নির্দিষ্ট পথে সমস্ত ফোল্ডার এবং ফাইলগুলি মুছে দেয়।
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);
আপনি যদি কেবলমাত্র পিএইচপি ফাইলগুলি মুছতে চান তবে নীচের হিসাবে এটি কল করুন
unlinkr($dir, "*.php");
আপনি ফাইলগুলি মুছতে অন্য যে কোনও পথ ব্যবহার করতে পারেন
unlinkr("/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);
}
?>
একবার আপনি চলমান পরীক্ষা শেষ করার পরে, ক্লাসে # ইউলিংক এবং #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 (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);
}
}
?>
ক্লিনআপ.এফপি:
<?php
/* include.. */
filesystem::rrmdir('/var/log');
filesystem::rrmdir('./cache');
?>
দেখে মনে হয় যে অন্যান্য সমস্ত উত্তর ফাংশনটিতে প্রদত্ত পথটি সর্বদা একটি ডিরেক্টরি হিসাবে অনুমান করে। এই রূপটি ডিরেক্টরি এবং একক ফাইলগুলি অপসারণ করতে কাজ করে:
/**
* Recursively delete a file or directory. Use with care!
*
* @param string $path
*/
function recursiveRemove($path) {
if (is_dir($path)) {
foreach (scandir($path) as $entry) {
if (!in_array($entry, ['.', '..'])) {
recursiveRemove($path . DIRECTORY_SEPARATOR . $entry);
}
}
rmdir($path);
} else {
unlink($path);
}
}
ডাইরেক্টরিআইটিরেটর এবং পুনরাবৃত্তি সঠিকভাবে ব্যবহার:
function deleteFilesThenSelf($folder) {
foreach(new DirectoryIterator($folder) as $f) {
if($f->isDot()) continue; // skip . and ..
if ($f->isFile()) {
unlink($f->getPathname());
} else if($f->isDir()) {
deleteFilesThenSelf($f->getPathname());
}
}
rmdir($folder);
}
কিছু স্ট্যাকওভারফ্লো আলোচনা থেকে আমি এই কোডটি তৈরি করেছি। আমি লিনাক্স পরিবেশে এখনও পরীক্ষা করিনি। এটি কোনও ফাইল বা ডিরেক্টরি মুছে ফেলার জন্য তৈরি করা হয়েছে, সম্পূর্ণ:
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 );
}
@ এক্সজাআর সমাধানের পরিবর্তিত রূপ। এটি খালি ফোল্ডারগুলি মুছে ফেলবে, যখন সমস্ত ফাইলগুলি সেগুলি থেকে মুছে ফেলা হয় এবং এটি ত্রুটিতে মিথ্যা ফিরিয়ে দেওয়ার পরিবর্তে ব্যতিক্রম ছুঁড়ে দেয়।
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'");
}
}
}
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);
}
}
unlink
, rmdir
) opendir
+ + readdir
কাজ দ্রুত যে scandir
এবং RecursiveDirectoryIterator
এটি সমস্ত কম মেমরি ব্যবহার করা হয়। আমাকে closedir
প্রথমে ফোল্ডারটি সরাতে , আমি এতে আটকে গিয়েছিলাম। এই উত্তরের জন্য ধন্যবাদ।