PHP için bir recursive dizin fonksiyonu?

5 Cevap php

Ben bir görüntüler alt klasörün içeriğini taşımak için PHP kullanıyorum

GalleryName / images /

başka bir klasör içine. Taşıdıktan sonra, ben GalleryName dizini and everything else inside it silmeniz gerekir.

Ben dizin boş olmadıkça rmdir() çalışmaz biliyorum. Ben, bir dosya bulunuyor ve scandir() eğer bir dizin ise scandir() üstten başlayan ve daha sonra unlink() için bir özyinelemeli işlev oluşturmak için çalışıyor bir süre geçirdim sonra rmdir() her boş dizin ben gitmek gibi.

isn't this a ridiculously simple function that PHP should be able to do? bir dizin Çıkarma - Şimdiye kadar bu tam olarak doğru değil çalışma, ve ben düşünmeye başladım?

Yani eksik bir şey var mı? Ya da insanlar bu eylem için kullanacağınız en az kanıtlanmış bir işlevi var?

Herhangi bir yardım mutluluk duyacağız.

PS I trust you all here more than the comments on the php.net site -- there are hundreds of functions there but I am interested to hear if any of you here recommend one over others.

5 Cevap

Ne bu konuda?

foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dirPath, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) {
    $path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname());
}
rmdir($dirPath);

Bu benim modifed / yarattık ve nihayet çalışıyor görünüyor tekrarlanan bir fonksiyon. Umarım bu çok tehlikeli bir şey yoktur.

function destroy_dir($dir) { 
    if (!is_dir($dir) || is_link($dir)) return unlink($dir); 
        foreach (scandir($dir) as $file) { 
            if ($file == '.' || $file == '..') continue; 
            if (!destroy_dir($dir . DIRECTORY_SEPARATOR . $file)) { 
                chmod($dir . DIRECTORY_SEPARATOR . $file, 0777); 
                if (!destroy_dir($dir . DIRECTORY_SEPARATOR . $file)) return false; 
            }; 
        } 
        return rmdir($dir); 
    } 

Ben nokta öneki ile gizli Unix dosyaları işleme ve topak kullanan bir işlevi adapte ettik:

public static function deleteDir($path) {
    if (!is_dir($path)) {
        throw new InvalidArgumentException("$path is not a directory");
    }
    if (substr($path, strlen($path) - 1, 1) != '/') {
        $path .= '/';
    }
    $dotfiles = glob($path . '.*', GLOB_MARK);
    $files = glob($path . '*', GLOB_MARK);
    $files = array_merge($files, $dotfiles);
    foreach ($files as $file) {
        if (basename($file) == '.' || basename($file) == '..') {
            continue;
        } else if (is_dir($file)) {
            self::deleteDir($file);
        } else {
            unlink($file);
        }
    }
    rmdir($path);
}

Uygulama sunucusu linux çalışır, sadece shell_exec () işlevini kullanın ve bu gibi, o rm-R komutunu verin:

shell_exec("rm ".$dir_path." -R");

Açıklama:

Fonksiyonu doğrudan linux içine yerleştirilen komutu çalışacaktır. Linux terminal komutunu çalıştırın Onun tam olarak aynı şey.

The command rm remove a file or directory passed in $dir_path and the option -R tells the system to run it recursively.

There is another thread with more examples here: How do I recursively delete a directory and its entire contents (files+sub dirs) in PHP?

Eğer Yii kullanıyorsanız o zaman çerçeveye bırakabilirsiniz:

CFileHelper::removeDirectory($my_directory);