barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

понедельник, 8 августа 2011 г.

php: рекурсивное удаление из директории файлов, имена которых не соответствуют шаблону

/**
 * Deletes from $dir all files, names of which not matching regexp
 * @param  $dir directory path (without tailing slash)
 * @param  $regexp regular expression to check filenames with preg_match.
 * Non mathing files will be deleted.
 * @param int $silent if 0, all messages (info / error) will be echoed, if 1 -
 * only error messages, if 2 - all output will be suppressed (defaults to 1)
 * @return int number of files, matching pattern and thus not deleted, -1 on failure
 */
function cleanDir($dir, $regexp, $silent=1)
{
    if(($dh=opendir($dir))!==false)
        {
        $noError = true;
        $filesStillInDir = 0;
        if(!$silent)
            echo "Cleaning dir $dir";
        while ($file = readdir($dh))
            {
            if($file != ".." && $file!=".")
                {
                if(is_dir($dir."/".$file)) // If directory - recursive call
                    {
                    $filesStillInSubDir = cleanDir($dir."/".$file,$regexp,$silent);
                    if(-1 != $filesStillInSubDir)
                        {
                        $filesStillInDir+=$filesStillInSubDir; // increase count of files, still remaining in current directory
                        
                        if(0 == $filesStillInSubDir) // no files, matching pattern, found in dir - delete it
                            {
                            if(!$silent)
                                echo "Dir $dir/$file empty - deleting";
                            if(!@rmdir($dir."/".$file))
                                {
                                $noError = false;
                                if($silent < 2)
                                    echo "
Error deleting dir after cleaning: $dir/$file
"; } } } else { if($silent < 2) echo "
Error cleaning dir $dir/$file
"; $noError = false; } } else // is file => check name and, if not matches - delete it { if(preg_match($regexp, $file) == 0) { if(!@unlink($dir."/".$file)) { $noError = false; if($silent < 2) echo "
Error deleting file $dir/$file
"; } } else $filesStillInDir++; } } } closedir($dh); if($noError) return $filesStillInDir; else return -1; } if($silent < 2) echo "
Error opening dir $dir for cleaning!
"; return -1; }

Дирактории, в которых не осталось файлов, также удаляются (кроме родительской директории, для которой функция была вызвана изначально).
Пример вызова (удаление всех файлов, кроме файлов интернационализации в Java):
$propFilesFound = cleanDir($pathToUnpack,'/Resources.*\.properties$/');

Комментариев нет:

Отправить комментарий