PHP का उपयोग कर एक फ़ोल्डर से सभी फ़ाइलों को हटाना?


306

उदाहरण के लिए मेरे पास `Temp 'नामक एक फ़ोल्डर था और मैं PHP का उपयोग करके इस फ़ोल्डर से सभी फ़ाइलों को हटाना या फ्लश करना चाहता था। क्या मैं ऐसा कर सकता था?


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
इसके अलावा DirectoryIterator या DirectoryRecursiveIterator है।
यूजीन

6
हालांकि यह स्पष्ट है, मैं इसका उल्लेख करता हूं, उदाहरण के लिए, 'पथ / से / अस्थायी / *। Txt' केवल txt फ़ाइलों और इतने पर निकाल देगा।
तृतीयक

क्या यह सापेक्ष रास्तों के लिए भी काम करता है? तो चलिए बताते हैं पूरा रास्ता "/ var / www / html / folder_and_files_to_delete /" और डिलीट स्क्रिप्ट "/var/www/html/delete_folders_and_files.php" में रखा गया है। क्या मैं पथ के रूप में सिर्फ "folder_and_files_to_delete" ले सकता हूं?
योना

1
@ योआन हां निश्चित है, जब तक कि सापेक्ष पथ सही है।
फ़्लर्न

क्या ग्लोब का उपयोग करने के लिए ठीक है यदि निर्देशिका में हजारों या सैकड़ों हजारों फाइलें हैं?
डेव Heq

260

यदि आप फ़ोल्डर (सबफ़ोल्डर्स सहित) से सब कुछ हटाना चाहते हैं array_map, तो unlinkऔर इस संयोजन का उपयोग करें glob:

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

यह कॉल खाली निर्देशिका (टिप के लिए धन्यवाद, @mojuba!) को भी संभाल सकती है


33
सर्वश्रेष्ठ उत्तर, धन्यवाद। नोटिस से बचने के लिए मैं glob("...") ?: [](PHP 5.4+) भी करूंगा क्योंकि खाली निर्देशिका glob()रिटर्न के लिए false
मोजुबा

14
यह वर्तमान फ़ोल्डर में सभी फ़ाइलों को हटा देता है, लेकिन यह सबफ़ोल्डर्स के लिए चेतावनी देता है और उन्हें हटाता नहीं है।
की-सिक्स

2
स्टिचोज़ा और मोजुबा के उत्तरों को array_map('unlink', ( glob( "path/to/temp/*" ) ? glob( "path/to/temp/*" ) : array() ) );
मिलाकर

7
@ ईवआउट: भले ही हम स्टिचोज़ा और मौजुबा के जवाब को जोड़ दें, क्योंकि आपका रिटर्न सबफ़ोल्डर्स के लिए एक ही चेतावनी देता है और यह उन्हें नष्ट नहीं करता है
सुलतान अल्लाउद्दीन

3
दुर्भाग्य से यह सबफ़ोल्डर्स को नहीं हटाता है।
तम्रोसिस

92

यहाँ मानक PHP लाइब्रेरी (SPL) का उपयोग करके अधिक आधुनिक दृष्टिकोण है ।

$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 फाइलें डिलीट कर दीं!
गुआरी

PHP 7.1 उपयोगकर्ताओं के लिए: $ फ़ाइल के बजाय $ file-> getRealPath () का उपयोग किया जाना चाहिए। अन्यथा, PHP आपको यह कहते हुए एक त्रुटि देगा कि अनलिंक करने के लिए एक पथ की आवश्यकता होती है, SplFileInfo का उदाहरण नहीं।
कीनेमास्टर

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

इसे अनलिंक ('/ पाथ / टू / डाइरेक्टरी /'.ऑन फाइलइन्फो-> getFilename ()) करना चाहिए; चूंकि अनलिंक पथ में ले जाता है। हालांकि अच्छा जवाब।
विक

8
आप अनलिंक भी कर सकते हैं ($ fileInfo-> getPathname ()); जो आपको फ़ाइल का पूरा रास्ता देगा। php.net/manual/en/directoryiterator.getpathname.php
जोश

क्या 'DirectoryIterator' भी उपनिर्देशिकाओं पर आधारित नहीं है? यदि ऐसा है तो 'अनलिंक' ऐसे मामलों में चेतावनी उत्पन्न करेगा। लूप के शरीर को यामिको के जवाब में अधिक पसंद नहीं करना चाहिए और इसके बजाय प्रत्येक प्रविष्टि की जांच करनी चाहिए कि क्या यह 'अनलिंक' कहने से पहले एक फ़ाइल है?
एंड्रियास लिनर्ट

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 .'*');

PHP द्वारा समर्थित किसी भी OS के लिए वही सटीक कमांड मौजूद है। ध्यान रखें कि यह फ़ाइलों को हटाने का एक सही तरीका है। $ AbsPathToFolder इस कोड को चलाने से पहले जाँच और सुरक्षित किया जाना चाहिए और अनुमतियाँ दी जानी चाहिए।


2
इस विधि का उपयोग करते हुए बिट असुरक्षित, यदि $absolutePatToFolderकभी खाली हो
लॉरेंस चेरोन

@ LawrenceCherone क्या अन्य विकल्प अधिक सुरक्षित हैं?
रॉब्सच

3
@LawrenceCherone मुझे आशा है कि आजकल रूट अनुमतियों के साथ कोई php नहीं चलता है। गंभीर होने के नाते, मैं उपरोक्त सभी कार्यों के रूप में इनपुट को "सुरक्षित" होने की उम्मीद करता हूं।
डारियो कॉर्नो

सबसे अधिक मतदान समाधान देव वातावरण में काम नहीं करते हैं जहां www या www-data स्वामी नहीं है। यह फ़ोल्डर के उचित अधिकारों को सेट करने के लिए सर्वर व्यवस्थापक पर निर्भर है। निष्पादन चीजों को प्राप्त करने के लिए एक अमूल्य उपकरण है, और बड़ी शक्ति, आदि के साथ stackoverflow.com/a/2765171/418974
क्रिश्चियन बोनटो

@ लॉरेंसचेरोन आप पूरी तरह से सही हैं मेरा जवाब एक बहुत ही विशिष्ट स्थिति के लिए था, सिर्फ प्रदर्शन के कारणों के लिए। अपने नोट्स के अनुसार मेरा उत्तर संशोधित किया।
दारियो कॉर्नो

8

PHP में एक फ़ोल्डर से सभी फ़ाइलों को हटाने का सरल और सबसे अच्छा तरीका है

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

यदि आप बस php फ़ाइलों को बस हटाना चाहते हैं, तो इसे निम्नानुसार कॉल करें

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

मैंने सबफ़ोल्डर्स के माध्यम से फ़ाइलों को हटाने के लिए @Stichoza के उत्तर को अपडेट किया।

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

"पुशे" नामक एक पैकेज है। इसका उपयोग करके, आप एक निर्देशिका को साफ़ कर सकते हैं या एक निर्देशिका को पूरी तरह से हटा सकते हैं ( जीथूब लिंक )। यह Packagist पर भी उपलब्ध है ।

उदाहरण के लिए, यदि आप Tempनिर्देशिका साफ़ करना चाहते हैं, तो आप कर सकते हैं:

Pusheh::clearDir("Temp");

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

यदि आप रुचि रखते हैं, तो विकी देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.