PHP скрипт для удаления точечных файлов из каталога Linux


Я работал над проектом, который включает в себя этап, в ходе которого скрипт должен автоматически удалить определенный каталог в Linux (и все его содержимое ).

В настоящее время я использую для этого следующий код:

# Perform a recursive removal of the obsolete folder
$dir_to_erase = $_SESSION['path'];
function removeDirectory($dir_to_erase) {
    $files = glob($dir_to_erase . '/*');
    foreach ($files as $file) {
        is_dir($file) ? removeDirectory($file) : unlink($file);
    }
    rmdir($dir_to_erase);
    return; 
}

Где $_SESSION['path'] - папка для удаления. Работал как заклинание ,но недавно мне пришлось добавить.htaccess файл в папку, и я заметил, что скрипт перестал работать правильно ( он продолжает удалять остальные файлы нормально, но не тот .htaccess архив ).

Может ли кто-нибудь указать мне, что я должен добавить в код, включая скрытые файлы точек в процессе удаления?

3 2

3 ответа:

Просто, вы можете положиться на DirectoryIterator

Класс DirectoryIterator предоставляет простой интерфейс для просмотра содержимое каталогов файловой системы.

function removeDirectory($dir_to_erase) {
    $files = new DirectoryIterator($dir_to_erase);
    foreach ($files as $file) {
        // check if not . or ..
        if (!$file->isDot()) {
            $file->isDir() ? removeDirectory($file->getPathname()) : unlink($file->getPathname());
        }
    }
    rmdir($dir_to_erase);
    return;
}

Там есть много функций, которые вы можете использовать, как проверить владельца, который довольно полезен, чтобы убедиться, что не удалить критический файл.

Вы также можете немного изменить свою функцию, чтобы удалить скрытые файлы:

function removeDirectory($dir) 
{
    if (is_dir($dir)) { 
        $objects = scandir($dir); 
        foreach ($objects as $object) { 
            if ($object != "." && $object != "..") { 
                if (is_dir($dir."/".$object))
                    removeDirectory($dir."/".$object);
                else
                    unlink($dir."/".$object); 
            } 
        }
        rmdir($dir); 
    } 
}

Согласно этому ответу:

PHP glob () не находит .htaccess

glob(".*") найдем .htaccess