【问题标题】:adding folders that are empty to disallowed array将空文件夹添加到不允许的数组
【发布时间】:2011-04-04 10:19:20
【问题描述】:

我正在使用一个数组,它允许我防止特定子文件夹包含在生成音频播放列表的脚本中。它看起来像这样:

$disallowed=array('..', '.', 'simon', 'steve');

我想找到一种方法来禁止任何空文件夹,或者更好的是,禁止其中没有任何 MP3 的文件夹(如果脚本将文件夹解释为非空文件夹,如果它们包含系统文件是自动生成的)。

我在下面包含了完整的脚本,以便您可以看到不允许的数组是如何适应的。

有人可以帮忙吗?

谢谢,

尼克

<?php

/*
* =====================
* FUNctions
* =====================
*/

/*
* array subvalue sort -- from: http://www.firsttube.com/read/sorting-a-multi-dimensional-array-with-php/
*
* this function lets me sort the multidimensional array containing song/artist information by the file modified time, a subvalue
*/
function subval_sort($a,$subkey) {
    foreach($a as $k=>$v) {
        $b[$k] = strtolower($v[$subkey]);
    }
    arsort($b); //change this to 'asort' for ascending
    foreach($b as $key=>$val) {
        $c[] = $a[$key];
    }
    return $c;
}

/*
* function written to clean up my messy code (too many slashes ... display '/' as '&raquo' (>>) for user friendliness )
*/
function clean($dirty, $type='general', $debug=false){

    //debug
    if($debug==true)
        echo'<br />value before clean: '.$dirty.' (first character: '.substr($dirty, 0, 1).')';

    /*
    * General cleaning -- remove '/' at front and end
    */
    if(substr($dirty, 0, 1)=='/'){
        //echo'<br />found leading /';
        $dirty=substr($dirty, 1, strlen($dirty)-1);
    }

    if(substr($dirty, -1)=='/')
        $dirty=substr($dirty, 0, strlen($dirty)-1);


    //prepare the subfolder display information by type
    if($type=='link')
        $dirty=str_replace(array('//','&raquo;'), array('/', '/'), $dirty); 

    else if($type=='display')
        $dirty=str_replace(array('///','//','/'), array('&raquo;','&raquo;', '&raquo;'), $dirty);   

    else
        $dirty=str_replace('&raquo;', '/', $dirty);


    if($debug==true)echo' | after clean: '.$dirty;

    //return
    return $dirty;
}

function makelink($linkme, $debug=false){
    $link=str_replace('&raquo;', '/', $linkme);
    $link=str_replace('//', '/', $link);
    return $link;

}

function recursiveGetSongs($directory, $fileinfo, $useID3, $getID3, $parent=null, $debug, $filtered=null){

    /*
    * configure function here:
    *
    * _usage_
    *   > the disallowed array should include any folders or files you explicitely don't want displayed
    *   > the allowedfiletypes array should include any file extentions you want to play
    */
    $disallowed=array('..', '.', 'simon', 'steve');
    $allowedfiletypes=array('mp3');

    if($filtered!=null){
        $disallowed=array_merge((array)$filtered, (array)$disallowed);
    }

    //simple error fix
    if($directory=='./')
        $directory='.';

    //debug
    if ($debug==true)echo'Dir to open: '.$directory;

    //open directory
    $dir = opendir($directory); 

    while ($read = readdir($dir)) 
    {

        //if ( !in_array($read, $disallowed) AND ( $filter!=null AND in_array($read, $filter) ) )
        if ( !in_array($read, $disallowed) )
        { 
            if($debug==true)echo $read.'<br />';
            //if is not dir, handle file
            if ( !is_dir($directory.'/'.$read) ){

                if($debug==true)echo '^^ not dir | dir: '.$directory.'<br />';

                if( in_array(substr($read, -3, 3), $allowedfiletypes) ){

                    if($useID3==TRUE){

                    //store id3 info
                    $FullFileName = realpath($directory.'/'.$read);
                    if($debug==TRUE)echo'<br />FFN &raquo; '.$FullFileName;
                    $ThisFileInfo = $getID3->analyze($FullFileName);
                    getid3_lib::CopyTagsToComments($ThisFileInfo);
                    $fileinfo[$read]['artist']=$ThisFileInfo['comments_html']['artist'][0];
                    $fileinfo[$read]['title']=$ThisFileInfo['comments_html']['title'][0];
                    $fileinfo[$read]['album']=$ThisFileInfo['comments_html']['album'][0];
                    $fileinfo[$read]['filename']=$ThisFileInfo['filename'];
                    $fileinfo[$read]['modified']=date ("YmdHis", filemtime($directory.'/'.$read));

                    if($debug==true)
                        echo "<br />$read was last modified: " . date ("YmdHis", filemtime($directory.'/'.$read));

                    $fileinfo[$read]['path']=$directory.'/'.$read;
                    if($debug==true)echo'<span style="margin-left: 10px;">path:'.$fileinfo[$read]['path'].' > fn: '.$fileinfo[$read]['filename'].'</span><br /><br />';

                    if($parent!=null)
                        $fileinfo[$read]['from']=str_replace(array('./', '//', '/'), array('', '&raquo;', '&raquo;'), $directory); // was =$parent

                    else
                        $fileinfo[$read]['from']='root'; //testing this

                    if($debug==true)echo'<br />'.$fileinfo[$read]['from'].'<br />';

                    //debug
                    //echo$ThisFileInfo['filename'].'<br />';
                    }
                    else{
                        //store filename
                        $fileinfo[$fileinfo['count']]['path']=$directory.'/'.$read;
                        $fileinfo[$fileinfo['count']]['fn']=$read;
                        if($parent!=null)
                            $fileinfo[$fileinfo['count']]['from']=str_replace(array('./', '//', '/'), array('', '&raquo;', '&raquo;'), $directory);

                        $fileinfo[$fileinfo['count']]['modified']=date ("YmdHis", filemtime($directory.'/'.$read));
                        //$fileinfo[$fileinfo['count']]=date ("YmdHis", filemtime($directory.'/'.$read));
                    }

                    //inc counter
                    $fileinfo['count']=$fileinfo['count']+1; // had ++ and it didn't work
                }
                else
                    ;//do nothing
            }

            //else, must be a folder (as determined above), recurse folder
            else{

                //debug
                if($debug==true)echo '^^ DIR<br />';

                //capture subfolders in case they are needed
                if($parent!='')$fileinfo['folders'].=$parent.'&raquo;'.$read.'|';
                else $fileinfo['folders'].=$read.'|';
                $fileinfo['folderpaths'].=$directory.'/|';

                $fileinfo=recursiveGetSongs($directory.'/'.$read, $fileinfo, $useID3, $getID3, $parent.'/'.$read, $debug, $filtered);

            }

        }

    }
    closedir($dir); 

    return $fileinfo;
}

?>

【问题讨论】:

  • 当然可以。我会再看看这个。上次我看了虽然没有有效的答案!但是现在可能还有一两个可以接受....

标签: php arrays filesystems directory


【解决方案1】:

使用glob('somefolder/*.mp3') 测试文件夹中是否有mp3。该函数将返回一个数组,因此如果它为空,则该文件夹不包含任何 mp3 文件。

【讨论】:

  • 谢谢,但我不确定如何包含这个是我的脚本,我现在已将其完整包含在我的原始帖子中。
【解决方案2】:

您可以尝试glob(),因为它比构建“有效数组”更灵活且更安全。

foreach (glob($dir . "/*.mp3") as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}

【讨论】:

  • 谢谢,但我不确定如何包含这个是我的脚本,我现在已将其完整包含在我的原始帖子中。
  • @Nick 从$dir = opendir(... 删除整个目录读取部分直到最后。您唯一需要的部分是实际的 ID3 阅读器。在一个目录上试试我的 sn-p,你会看到你得到了什么。在我的 sn-p 中,$filename 等于您的 $read 变量,如果我是对的。
  • 谢谢。我尝试删除从$dir = opendir(closedir($dir); 的所有内容,将您的sn-p 放在它的位置,将$filename 更改为$read,但随后没有文件夹出现。我对php的了解非常有限(我发布的大部分脚本都是别人写的),所以很可能是我的无知!
  • @Nick 请至少阅读glob() 的文档,而不是简单地从任何地方复制粘贴 sn-ps。我编写的示例仅列出单个目录中的 mp3 文件。不是递归的,不是 mp3 和目录,而是 mp3。在链接的文档中,您还可以找到一些有关递归目录发现的示例。
  • @fabrik 好的,谢谢。我会对此进行调查,尽管它可能超出了我的范围(或者至少超出了我现在所拥有的时间)。我希望有一种方法可以简单地将项目/变量添加到我不允许的数组中,以排除空文件夹。感谢您为我指明 glob() 的方向。
猜你喜欢
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
相关资源
最近更新 更多