PHP通过不同的目录计数,看看哪些目录中有0个文件

时间:2012-03-20 20:07:34

标签: php image filesystems

我有以下文件夹结构:

images/photo-gallery/2e/
                     72/
                     rk/
                     u3/
                     va/
                     yk/

......等等。基本上,每次上传图像时,它都会散列名称,然后创建一个包含前两个字母的文件夹。因此,2e内部是 2e0gpw1p.jpg

这就是...如果我删除了一个图像,它将删除该文件,但它将保留它所在的文件夹。现在,当我上传了一些TON图像时,这将很好,因为很多图像将会共享相同的文件夹..但在那之前,我将最终拥有一堆空目录。

我想要做的是搜索照片库文件夹并浏览每个目录,看看哪些文件夹是空的..如果有任何空文件夹,那么它将删除它。

我知道如何为单个目录执行此操作,例如2e文件夹。但是我如何为照片库文件夹中的所有文件夹执行此操作?

3 个答案:

答案 0 :(得分:1)

如果目录不为空,PHP函数rmdir()将发出警告,因此您可以在非空目录上使用它而不会有删除它们的风险。将它与scandir()和array_slice(删除。和..)相结合,你可以这样做:

foreach(array_slice(scandir('images/photo-gallery'),2) as $dir) {
    @rmdir('images/photo-gallery/' . $dir); // use @ to silence the warning
}

答案 1 :(得分:0)

虽然你可以用php做,但我倾向于使用os来完成这样的任务。当然你可以用php调用下面的

find <parent-dir> -depth -type d -empty -exec rmdir -v {} \;

答案 2 :(得分:0)

请仔细阅读此警告我没有测试但是使用了类似的代码时间。如果您不理解这可能会使您自己从服务器上擦掉您的网站,请自行使用此功能并且不要使用。

编辑备份一切在尝试第一次之前路径非常非常重要!

好的,说这很容易:)

<?php
    function recursiveDelete($path){
        $ignore = array(
            'cgi-bin',
            '.',
            '..'
        ); // Directories to ignore

        $dh = opendir($path); // Open the directory

        while(false !== ($file = readdir($dh))){ // Loop through the directory

            if(!in_array($file, $ignore)){ // Check that this file is not to be ignored 

                if(is_dir($path."/".$file)){ // Its a directory, keep going

                    if(!iterator_count(new DirectoryIterator($path."/".$file)))
                        rmdir($path."/".$file); // its empty delete it
                    } else {
                        recursiveDelete($path."/".$file);// Recursive call to self
                    }

                }

            }

        }

        closedir($dh); // All Done close the directory 

    }

    // WARNING IMPROPERLY USED YOU CAN DUMP YOUR ENTIRE SERVER USE WITH CAUTION!!!!
    // I WILL NOT BE HELD RESPONSIBLE FOR MISUSE
    recursiveDelete('/some/directoy/path/to/your/gallery');
?>