it-swarm.com.de

Alle Dateien mit PHP aus einem Ordner löschen?

Ich hatte zum Beispiel einen Ordner namens "Temp" und wollte alle Dateien aus diesem Ordner mit PHP löschen oder löschen. Könnte ich das machen?

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

Wenn Sie "versteckte" Dateien wie .htaccess entfernen möchten, müssen Sie verwenden

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

Wenn Sie alles aus einem Ordner (einschließlich Unterordner) löschen möchten, verwenden Sie diese Kombination aus array_map, unlink und glob:

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

Update

Dieser Aufruf kann auch leere Verzeichnisse verarbeiten - danke für den Tipp, @mojuba!

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

Hier ist ein modernerer Ansatz unter Verwendung der Standard PHP Library (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;
82
Yamiko
foreach (new DirectoryIterator('/path/to/directory') as $fileInfo) {
    if(!$fileInfo->isDot()) {
        unlink($fileInfo->getPathname());
    }
}
68
JakeParis

Dieser Code aus 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);
    }
}
19
Poelinca Dorin
$dir = 'your/directory/';
foreach(glob($dir.'*.*') as $v){
    unlink($v);
}
14
Haim Evgi

Siehe readdir und unlink .

<?php
    if ($handle = opendir('/path/to/files'))
    {
        echo "Directory handle: $handle\n";
        echo "Files:\n";

        while (false !== ($file = readdir($handle)))
        {
            if( is_file($file) )
            {
                unlink($file);
            }
        }
        closedir($handle);
    }
?>
11
StampedeXV

Angenommen, Sie haben einen Ordner mit VIELEN Dateien, die alle lesen und dann in zwei Schritten löschen. Dies ist nicht die Ausführung von . Ich glaube, dass die beste Methode zum Löschen von Dateien die Verwendung eines Systembefehls ist. 

Zum Beispiel für Linux verwende ich:

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

Oder wenn Sie eine rekursive Löschung wünschen, ohne eine rekursive Funktion schreiben zu müssen

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

die gleichen exakten Befehle gibt es für jedes Betriebssystem, das von PHP ..__ unterstützt wird. Denken Sie daran, dass dies eine PERFORMANCE-Methode zum Löschen von Dateien ist. $ absolutePathToFolder MUSS vor der Ausführung dieses Codes geprüft und gesichert werden, und Berechtigungen müssen erteilt werden.

9
Dario Corno

Die einfachste und beste Möglichkeit, alle Dateien aus einem Ordner in PHP zu löschen

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

Habe diesen Quellcode von hier - http://www.codexworld.com/delete-all-files-from-folder-using-php/

8
JoyGuru

Eine andere Lösung: Diese Klasse löscht alle Dateien, Unterverzeichnisse und Dateien in den Unterverzeichnissen.

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
tommy

die unlinkr-Funktion löscht rekursiv alle Ordner und Dateien im angegebenen Pfad, indem sichergestellt wird, dass das Skript selbst nicht gelöscht wird.

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

wenn Sie alle Dateien und Ordner löschen möchten, in denen Sie dieses Skript ablegen, rufen Sie es wie folgt auf

//get current working directory
$dir = getcwd();
unlinkr($dir);

wenn Sie nur PHP-Dateien löschen möchten, rufen Sie es wie folgt auf

unlinkr($dir, "*.php");

sie können auch einen anderen Pfad verwenden, um die Dateien zu löschen 

unlinkr("/home/user/temp");

Dadurch werden alle Dateien im Verzeichnis home/user/temp gelöscht.

4
Tofeeq

Eine allgemeine Datei- und Ordnerbehandlungsklasse für das Kopieren, Verschieben, Löschen, Berechnen der Größe usw. wurde bereitgestellt, die eine einzelne Datei oder eine Reihe von Ordnern verarbeiten kann. 

https://Gist.github.com/4689551

Benutzen: 

So kopieren Sie eine einzelne Datei oder einen Satz von Ordnern/Dateien (oder verschieben sie):

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

Löschen Sie eine einzelne Datei oder alle Dateien und Ordner in einem Pfad:

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

Berechnen Sie die Größe einer einzelnen Datei oder einer Gruppe von Dateien in einer Reihe von Ordnern:

$files = new Files();
$results = $files->calculateSize('source/folder/optional-file.name');
3
AmyStephen
 <?
//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
user5579724

Für mich war die Lösung mit readdir die beste und funktionierte wie ein Zauber. Bei glob schlug die Funktion in einigen Szenarien fehl.

// 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);
}
1

Es gibt ein Paket namens "Pusheh". Damit können Sie ein Verzeichnis löschen oder ein Verzeichnis vollständig entfernen ( Github link ). Es ist auch auf Packagist verfügbar.

Wenn Sie beispielsweise das Verzeichnis Temp löschen möchten, können Sie Folgendes tun:

Pusheh::clearDir("Temp");

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

Wenn Sie interessiert sind, sehen Sie das Wiki .

0
MAChitgarha

Ich habe die Antwort von @Stichoza aktualisiert, um Dateien durch Unterordner zu entfernen.

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
tzi
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
Mehmet