কোনও ফোল্ডার থেকে পিএইচপি ব্যবহার করে সমস্ত ফাইল মোছা হচ্ছে?


306

উদাহরণস্বরূপ আমার কাছে `টেম্প 'নামে একটি ফোল্ডার ছিল এবং আমি পিএইচপি ব্যবহার করে এই ফোল্ডার থেকে সমস্ত ফাইল মুছতে বা ফ্লাশ করতে চেয়েছিলাম। আমি কি এটা করতে পারি?


14
সদৃশ হিসাবে চিহ্নিত করার আগে এই প্রশ্নের উত্তর নীচে দেওয়া হয়েছিল এটি খুব ভাল। নীচের উত্তরগুলি লিঙ্কযুক্ত উত্তর হওয়া প্রশ্নের চেয়ে ভাল। এছাড়াও প্রশ্নটি আলাদা, এই প্রশ্নটি মুছে ফেলা নয়, একটি ডিরেক্টরি খালি করতে বলে।
বার্ট বার্গ

1
হ্যাঁ, এটি একটি পৃথক প্রশ্ন যা বিভিন্ন উত্তর আকর্ষণ করেছিল। এটি সদৃশ হিসাবে চিহ্নিত করা উচিত নয়।
ড্যানিয়েল

উত্তর:


638
$files = glob('path/to/temp/*'); // get all file names
foreach($files as $file){ // iterate files
  if(is_file($file))
    unlink($file); // delete file
}

আপনি যদি htaccess এর মতো 'লুকানো' ফাইলগুলি মুছতে চান তবে আপনাকে ব্যবহার করতে হবে

$files = glob('path/to/temp/{,.}*', GLOB_BRACE);

4
এছাড়াও ডিরেক্টরীআইট্রেটর বা ডিরেক্টরীরেচার্সআইট্রেটার রয়েছে।
ইউজিন

6
যদিও এটি সুস্পষ্ট, আমি উল্লেখ করেছি, উদাহরণস্বরূপ, 'path / to / temp / *। Txt' কেবলমাত্র txt ফাইলগুলি মুছে ফেলবে।
টারটিয়াম

এটি কি আপেক্ষিক পাথের জন্যও কাজ করে? সুতরাং আসুন আমরা পুরো পথটি "/ var / www / html / ফোল্ডার_আর_ফায়ালস_ টো_ডিলেট /" এবং মুছে ফেলা স্ক্রিপ্টটি "/var/www/html/delete_folders_and_files.php" এ স্থাপন করি। আমি কি কেবল "ফোল্ডার_আর_ফায়ালগুলি_পৃষ্ঠিকা "টিকে পথ হিসাবে নিতে পারি?
ইয়োনো

1
@ আয়ানো হ্যাঁ নিশ্চিত, যতক্ষণ না আপেক্ষিক পথটি সঠিক।
ফ্লার্ন

ডিরেক্টরিতে যদি কয়েক হাজার বা কয়েকশো ফাইল থাকে তবে গ্লোবটি কী ঠিক আছে?
ডেভ হেক

260

আপনি (সাবফোল্ডার সহ) এই সংমিশ্রণ ব্যবহার ফোল্ডার থেকে সবকিছু মুছে ফেলতে চান array_map, unlinkএবং glob:

array_map( 'unlink', array_filter((array) glob("path/to/temp/*") ) );

এই কলটি খালি ডিরেক্টরি পরিচালনা করতে পারে (টিপটির জন্য ধন্যবাদ, @ মজুবা!)


33
সেরা উত্তর, ধন্যবাদ। বিজ্ঞপ্তিগুলি এড়াতে আমিও করব glob("...") ?: [](পিএইচপি 5.4+) কারণ খালি ডিরেক্টরি glob()রিটার্নের জন্য false
মোজুবা

14
এটি বর্তমান ফোল্ডারে থাকা সমস্ত ফাইল মুছে ফেলে তবে এটি সাবফোল্ডারগুলির জন্য একটি সতর্কতা ফিরিয়ে দেয় এবং সেগুলি মুছে দেয় না।
কী-সিক্স

2
স্টিচোজার এবং মোজুবার জবাবগুলির সংমিশ্রণ:array_map('unlink', ( glob( "path/to/temp/*" ) ? glob( "path/to/temp/*" ) : array() ) );
ইওআউট

7
@ আগত: এমনকি যদি আমরা স্টিচোজার এবং মৌজুবার জবাব একত্রিত করি তবে আপনার দেওয়া সাবফোল্ডারদের জন্য একই সতর্কবার্তা প্রদান করে এবং এটি তাদের মুছে দেয় না
সুলতান আলাউদ্দিন

3
দুর্ভাগ্যক্রমে এটি সাবফোল্ডারগুলি মুছবে না।
tmarois

92

এখানে স্ট্যান্ডার্ড পিএইচপি লাইব্রেরি (এসপিএল) ব্যবহার করে আরও আধুনিক পদ্ধতির ব্যবস্থা করা হয়েছে ।

$dir = "path/to/directory";
$di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
foreach ( $ri as $file ) {
    $file->isDir() ?  rmdir($file) : unlink($file);
}
return true;

1
এটি দুর্দান্তভাবে কাজ করে, যখন আপনার কোনও এসএসএইচ অ্যাক্সেস নেই এবং এফটিপি আক্ষরিকভাবে প্রচুর ফাইল এবং ফোল্ডারগুলি মুছতে সময় লাগে ... এই লাইনের সাহায্যে আমি 3 সেকেন্ডেরও কম সময়ে 35000 ফাইল মুছলাম!
গ্যারি

পিএইচপি 7.1 ব্যবহারকারীর জন্য: ফাইলের পরিবর্তে $ ফাইল-> getRealPath () ব্যবহার করতে হবে। অন্যথায়, পিএইচপি আপনাকে এই বলে ত্রুটি দেবে যে লিঙ্কমুক্ত করার জন্য একটি পাথ প্রয়োজন, স্প্লিলফিলইনফোর উদাহরণ নয়।
কেইনমাস্টার

68
foreach (new DirectoryIterator('/path/to/directory') as $fileInfo) {
    if(!$fileInfo->isDot()) {
        unlink($fileInfo->getPathname());
    }
}

এটি লিঙ্কমুক্ত হওয়া উচিত ('/ path / to / ডিরেক্টরি /'.$ fileInfo-> getFilename ()); যেহেতু আনলিংকটি পথে চলে। ভাল উত্তর যদিও।
ভিক

8
এমনকি আপনি লিঙ্কমুক্ত করতে পারেন ($ fileInfo-> getPathname ()); যা আপনাকে ফাইলের পুরো পথ দেবে। php.net/manual/en/directoryiterator.getpathname.php
জোশ হোলোয়

'ডিরেক্টরি নির্দেশক' কি উপ-ডিরেক্টরিতেও পুনরাবৃত্তি করে না? যদি 'লিঙ্কমুক্ত করা হয়' তবে এই ধরনের ক্ষেত্রে একটি সতর্কতা উত্পন্ন করবে। ল্যাম্পটির শরীরটি এর পরিবর্তে ইয়ামিকোর জবাবের মতো দেখতে পাওয়া উচিত নয় এবং প্রতিটি লিঙ্কটি যদি 'লিঙ্কমুক্ত' বলার আগে ফাইল হয় তবে তা পরীক্ষা করা উচিত নয়?
আন্দ্রে লিনার্ট

19

Http://php.net/unlink থেকে এই কোড :

/**
 * Delete a file or recursively delete a directory
 *
 * @param string $str Path to file or directory
 */
function recursiveDelete($str) {
    if (is_file($str)) {
        return @unlink($str);
    }
    elseif (is_dir($str)) {
        $scan = glob(rtrim($str,'/').'/*');
        foreach($scan as $index=>$path) {
            recursiveDelete($path);
        }
        return @rmdir($str);
    }
}



10

ধরে নিই যে আপনার ফোল্ডারে প্রচুর ফাইল রয়েছে এবং সেগুলি দুটি পড়া এবং তারপরে দুটি পদক্ষেপে মুছে ফেলা যে পারফরম্যান্স তা নয়। আমি বিশ্বাস করি ফাইলগুলি মুছে ফেলার সর্বাধিক সম্পাদিত উপায় হ'ল কেবলমাত্র একটি সিস্টেম কমান্ড ব্যবহার করা।

উদাহরণস্বরূপ লিনাক্সে আমি ব্যবহার করি:

exec('rm -f '. $absolutePathToFolder .'*');

অথবা এটি যদি আপনি পুনরাবৃত্ত ফাংশন লেখার প্রয়োজন ছাড়াই পুনরাবৃত্ত মোছা করতে চান

exec('rm -f -r '. $absolutePathToFolder .'*');

পিএইচপি দ্বারা সমর্থিত কোনও ওএসের জন্য একই সঠিক কমান্ড বিদ্যমান। মনে রাখবেন এটি ফাইল মুছে ফেলার এক পারফর্মিং উপায়। এই কোডটি চালানোর আগে o পরমপথটোফোল্ডারটি অবশ্যই চেক করা উচিত এবং সুরক্ষিত হওয়া উচিত এবং অনুমতি অবশ্যই মঞ্জুর করতে হবে।


2
এই পদ্ধতিটি ব্যবহার করে অনিরাপদ বিট, যদি $absolutePatToFolderকখনও ফাঁকা থাকে
লরেন্স চেরোন

@ লরেন্সচেরোন অন্যান্য বিকল্পগুলি কি আরও নিরাপদ?
রোবস

3
@ লরেন্সচেরোন আশা করি আজকাল কোনও রুট রুট অনুমতি নিয়ে পিএইচপি চালাচ্ছে না। গুরুতর হওয়ার কারণে, আমি উপরের সমস্ত ফাংশন হিসাবে ইনপুটটি "সুরক্ষিত" হওয়ার প্রত্যাশা করি।
দারিও কর্নো

সর্বাধিক নির্বাচিত সমাধানগুলি এমন পরিবেশে পরিবেশ তৈরি করে না যেখানে www বা www-ডেটা মালিক নয়। ফোল্ডারের যথাযথ অধিকার সেট করা আছে তা নিশ্চিত করার জন্য এটি সার্ভার প্রশাসকের উপর নির্ভর করে to এক্সিকিউট জিনিসগুলি সম্পন্ন করার জন্য এবং দুর্দান্ত শক্তি ইত্যাদির জন্য একটি অমূল্য সরঞ্জাম st stackoverflow.com/a/2765171/418974
খ্রিস্টান বোনাটো

@ লরেন্সচেরোন আপনি সম্পূর্ণরূপে সঠিক বলেছেন আমার উত্তরটি কেবলমাত্র পারফরম্যান্সের কারণে, একটি নির্দিষ্ট পরিস্থিতির জন্য বোঝানো হয়েছিল। আপনার নোট অনুসারে আমার উত্তর পরিবর্তন করেছে।
দারিও কর্নো

8

পিএইচপি-র কোনও ফোল্ডার থেকে সমস্ত ফাইল মোছার সহজ এবং সর্বোত্তম উপায়

$files = glob('my_folder/*'); //get all file names
foreach($files as $file){
    if(is_file($file))
    unlink($file); //delete file
}

এখান থেকে এই উত্স কোডটি পেয়েছেন - http://www.codexworld.com/delete-all-files-from-folder-using-php/


4

আরেকটি সমাধান: এই শ্রেণীটি সাব ডিরেক্টরিগুলির সমস্ত ফাইল, উপ ডিরেক্টরি এবং ফাইলগুলি মুছবে।

class Your_Class_Name {
    /**
     * @see http://php.net/manual/de/function.array-map.php
     * @see http://www.php.net/manual/en/function.rmdir.php 
     * @see http://www.php.net/manual/en/function.glob.php
     * @see http://php.net/manual/de/function.unlink.php
     * @param string $path
     */
    public function delete($path) {
        if (is_dir($path)) {
            array_map(function($value) {
                $this->delete($value);
                rmdir($value);
            },glob($path . '/*', GLOB_ONLYDIR));
            array_map('unlink', glob($path."/*"));
        }
    }
}

4

লিঙ্ক-লিঙ্ক ফাংশন পুনরাবৃত্তভাবে নির্দিষ্ট স্ক্রিপ্টটি মুছে দেয় না তা নিশ্চিত করে নির্দিষ্ট পথে সমস্ত ফোল্ডার এবং ফাইলগুলি মুছে দেয়।

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

এটি হোম / ব্যবহারকারী / অস্থায়ী ডিরেক্টরিতে থাকা সমস্ত ফাইল মুছে ফেলবে।


3

অনুলিপি, সরানো, মুছতে, আকার গণনা ইত্যাদির জন্য সাধারণ উদ্দেশ্যে ফাইল এবং ফোল্ডার হ্যান্ডলিং ক্লাস পোস্ট করেছে, যা কোনও একক ফাইল বা ফোল্ডারগুলির সেট পরিচালনা করতে পারে।

https://gist.github.com/4689551

ব্যবহার করা:

একটি একক ফাইল বা ফোল্ডার / ফাইলের একটি সেট অনুলিপি (বা সরানো):

$files = new Files();
$results = $files->copyOrMove('source/folder/optional-file', 'target/path', 'target-file-name-for-single-file.only', 'copy');

কোনও একক ফাইল বা সমস্ত ফাইল এবং ফোল্ডারগুলিকে একটি পথে মুছুন:

$files = new Files();
$results = $files->delete('source/folder/optional-file.name');

একটি একক ফাইলের আকার বা ফোল্ডারের একটি সেটে ফাইলগুলির একটি সেট গণনা করুন:

$files = new Files();
$results = $files->calculateSize('source/folder/optional-file.name');

1
 <?
//delete all files from folder  & sub folders
function listFolderFiles($dir)
{
    $ffs = scandir($dir);
    echo '<ol>';
    foreach ($ffs as $ff) {
        if ($ff != '.' && $ff != '..') {
            if (file_exists("$dir/$ff")) {
                unlink("$dir/$ff");
            }
            echo '<li>' . $ff;
            if (is_dir($dir . '/' . $ff)) {
                listFolderFiles($dir . '/' . $ff);
            }
            echo '</li>';
        }
    }
    echo '</ol>';
}
$arr = array(
    "folder1",
    "folder2"
);
for ($x = 0; $x < count($arr); $x++) {
    $mm = $arr[$x];
    listFolderFiles($mm);
}
//end
?> 

1

আমার জন্য, সমাধানটি readdirসর্বোত্তম ছিল এবং কবজির মতো কাজ করেছিল। সাথে glob, ফাংশনটি কিছু পরিস্থিতিতে ব্যর্থ হয়েছিল।

// Remove a directory recursively
function removeDirectory($dirPath) {
    if (! is_dir($dirPath)) {
        return false;
    }

    if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
        $dirPath .= '/';
    }

    if ($handle = opendir($dirPath)) {

        while (false !== ($sub = readdir($handle))) {
            if ($sub != "." && $sub != ".." && $sub != "Thumb.db") {
                $file = $dirPath . $sub;

                if (is_dir($file)) {
                    removeDirectory($file);
                } else {
                    unlink($file);
                }
            }
        }

        closedir($handle);
    }

    rmdir($dirPath);
}

0

সাবফোল্ডারগুলির মাধ্যমে ফাইলগুলি সরাতে আমি @ স্টিচোজার উত্তর আপডেট করেছি।

function glob_recursive($pattern, $flags = 0) {
    $fileList = glob($pattern, $flags);
    foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) {
        $subPattern = $dir.'/'.basename($pattern);
        $subFileList = glob_recursive($subPattern, $flags);
        $fileList = array_merge($fileList, $subFileList);
    }
    return $fileList;
}

function glob_recursive_unlink($pattern, $flags = 0) {
    array_map('unlink', glob_recursive($pattern, $flags));
}

0
public static function recursiveDelete($dir)
{
    foreach (new \DirectoryIterator($dir) as $fileInfo) {
        if (!$fileInfo->isDot()) {
            if ($fileInfo->isDir()) {
                recursiveDelete($fileInfo->getPathname());
            } else {
                unlink($fileInfo->getPathname());
            }
        }
    }
    rmdir($dir);
}

0

"পুষেহ" নামে একটি প্যাকেজ রয়েছে। এটি ব্যবহার করে, আপনি একটি ডিরেক্টরি সাফ করতে পারেন বা একটি ডিরেক্টরি পুরোপুরি সরিয়ে ফেলতে পারেন ( গিথুব লিঙ্ক )। এটি প্যাকেজিস্টেও উপলব্ধ ।

উদাহরণস্বরূপ, আপনি যদি Tempডিরেক্টরিটি সাফ করতে চান তবে আপনি এটি করতে পারেন:

Pusheh::clearDir("Temp");

// Or you can remove the directory completely
Pusheh::removeDirRecursively("Temp");

আপনি যদি আগ্রহী হন তবে উইকিটি দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.