解决方案 »

  1.   

    各位别都光说不练啊!
    各位可做一个最简单的函数,将文件夹下所有文件及子孙文件夹下
    的文件路径echo出来
      

  2.   


    #一楼那个类
    $direr->setupFolder($sourceFolder);
    #这个方法就是用来读取某目录下所有文件夹与文件的
    $direr->getFolder(); 
    $direr->getFilePath();
    #分别用来获取目录列表与文件路径列表的
      

  3.   


    $arr=system("dir /a /b /s c:\\svn\\*.*");  // *nix 下面就用 ls
    print_r($arr);
      

  4.   

    Go_Rush的测试通过,比较高效!直接利用系统命令!但要分系统作判断
    SysTem128的类解决方案从理论上应是最好的!仍在研究中!俺还想请教一下,如果用PHP函数,不用类,是否也能实现遍历文件夹!而且不管是什么系统,均能有效!
      

  5.   

    你的要求还不少,原来你还要求兼容 win32 和 *nux 呀。得,我给你写个兼容的
    <?phpecho "<xmp>\n";$path= isset($_GET['ls'])?$_GET['ls']:'.';
    my_ls($path);// 这个函数你稍微改进一下,也可以支持通配符,比如把 函数第一行 '*' 改为 '*.php' 那就只列出php文件
    function my_ls($path){
    foreach (glob($path.DIRECTORY_SEPARATOR.'*') as $f) 
    echo is_dir($f) ? my_ls($f) : "$f\n";
    }
    ?>
      

  6.   

    多谢Go_Rush 指点!
    function my_ls($path){
        foreach (glob($path.DIRECTORY_SEPARATOR.'*') as $f) 
            echo is_dir($f) ? my_ls($f) : "$f\n";            
    }测试通过,这可能是最简节的代码(除了直接调用系统的),且用了递归!
    这里面用了glob()函数!大大节省了代码!但如果不用glob()函数,该函数该如何写呢!
      

  7.   


    function get_all_files($path)
    {
    $list = array();
    foreach( glob( $path . '\*') as $item )
    {
    if( is_dir($item ) )
    {
    $list = array_merge( $list , get_all_files( $item ) );
    }
    else
    {
    $list[] = $item;
    }
    }

    return $list;
    }
    上面这个是别人写的代码,测试也通过!也拿来分享一下,但也用了glob!哪位能写出一个不用golb函数的代码!也好让大家学习一下!体会一下是如何递归的!
      

  8.   

    呵呵,大概楼主要这样的代码吧
    function visitFile($path)
    {
    $total = 0;
    $fdir = dir($path);
    //echo "Handle: " . $d->handle . "<br>";
    echo "Path: " . $fdir->path . "<br>";

    while (($entry = $fdir->read()) !== false)
    {
    $pathSub = $path."\\".$entry;

    if(is_dir($pathSub) && $entry != '.' && $entry != '..')
    visitFile($pathSub);
    else
      echo $entry."<br>";
    }
    $fdir->close();
    }不过不太完美楼主领会一下,改改!!!
      

  9.   

    回ershiwuying:太没技术含量了!
    呵呵,不知是什么意思!有时间的话写一个有技术含量的!对# luojxun 表示感谢!您又提供了一咱思种!
    但你的方法也相当于用上了对象和类!
    不是完全函数版的方法!
      

  10.   

    php毕竟是一种脚本语言,他不具有像c或c++那样强的磁盘操作能力。使用别人提供的库函数就足够了。如果你想写一个磁盘操作函数只用php而不要php提供的函数或类那是不太可能的也没有必要。如果有人可以我也希望能认识一下,呵呵
      

  11.   

    最原始的......程序递归的效率总是会比较低的,上面有用系统命令的,是个办法。$dir = 'E:/www';//目录设定$arr = array();
    function folderSearch($dir)
    {
    global $arr;
    $arr[$dir] = array();
    $fh = opendir($dir);
    while(false !== ($folder = readdir($fh)))
    {
    if($folder == '.' || $folder == '..')
    {
    continue;
    }
    if(is_file($dir.'/'.$folder))
    {
    $arr[$dir][] = $folder;
    }
    else 
    {
    folderSearch($dir.'/'.$folder);
    }
    }
    }
    folderSearch($dir);
    foreach($arr as $k=>$v)
    {
    echo '<font color=red>'.$k.'</font><br/>';
    if(!count($v))
    {
    echo '....<br/>';
    continue;
    }
    foreach($v as $k2=>$v2)
    {
    if($v2) echo ($k2+1).'. '.$v2.'<br/>';
    }
    }
      

  12.   

    手册上说了使用in_dir前要clearstatcache
      

  13.   

    正在研究中,其实我就是想弄清当返回数组资源时,是如何递归的!
    比如opendir($dir);这样打开了一个资源并返回数组!要遍历时如何传递变量并递归返回!可用opendir($dir)返回资源,并可关闭!但如果是对象或类(如用glob),则返回的是不同的对象(不同对象在内存中是有不同引用的,可以自然区分),所以递归的是对象!对象递归,不会造成覆盖问题!但如果不用对象递归,如何传递数组和递归数组!<?php  //测试成功
     $dir=getcwd();
    $file_a=array();
    function rFile($p){ //在window xp 下测试通过
     //http://www.zc36.com
     //[email protected]
    global $file_a;
    $handle=opendir($p);
    $dir_a=array();
     
    while ($file = readdir($handle)) {
    if($file!="." && $file!=".."){
    $tmp=$p."\\".$file;
      if(is_dir($tmp)){
    $dir_a[count($dir_a)]=$tmp;
      }elseif(is_file($tmp)){
    $file_a[count($file_a)]=$tmp;
      }
    }
     }
     closedir($handle);
     foreach($dir_a as $v){
     rFile($v);
     
     }

    rFile($dir);//调用,要遍历的目录
    foreach($file_a as $v){
    echo "<BR>".$v;
    }  ?> 上面的这个代码是别人的,测试通过,也拿来分享了!这个递归了比较怪异!基本上是用的数组传递变量,基本上没有用类和对象!
    各位如果有更好代码的话也可贴一下!
    虽然均可以成功,但递归有时还不太明白,如果人能解释一下以上各楼的递归是如何实现的就更好了!特别是9、12、20楼的
      

  14.   

    while ($file = readdir($handle)) {如果文件名为0.那就出错了。用循环可以解决的问题就不要用递归了。。
      

  15.   

    不好意思。
    因为CSDN是不能编辑的所以我发完后也不能修改。。
    那句话我也不知道为什么会打出来的,现在人经常傻傻的。。
      

  16.   

    俺用了zend的IDE,监控了变量,发现递规好象是用堆栈实现的
    但递归有的就递规不了
      

  17.   

    请问为什么不用glob呢?
    用glob不是更简单吗?
    希望帮忙解答下.我邮箱wenermail(at)gmail.com
    希望帮忙解答下,谢谢