探讨:各位最佳的递归遍历文件夹程式? http://blog.csdn.net/SysTem128/archive/2007/12/18/1947950.aspx给门生写的^_^! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 各位别都光说不练啊!各位可做一个最简单的函数,将文件夹下所有文件及子孙文件夹下的文件路径echo出来 #一楼那个类$direr->setupFolder($sourceFolder);#这个方法就是用来读取某目录下所有文件夹与文件的$direr->getFolder(); $direr->getFilePath();#分别用来获取目录列表与文件路径列表的 $arr=system("dir /a /b /s c:\\svn\\*.*"); // *nix 下面就用 lsprint_r($arr); Go_Rush的测试通过,比较高效!直接利用系统命令!但要分系统作判断SysTem128的类解决方案从理论上应是最好的!仍在研究中!俺还想请教一下,如果用PHP函数,不用类,是否也能实现遍历文件夹!而且不管是什么系统,均能有效! 你的要求还不少,原来你还要求兼容 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"; }?> 多谢Go_Rush 指点!function my_ls($path){ foreach (glob($path.DIRECTORY_SEPARATOR.'*') as $f) echo is_dir($f) ? my_ls($f) : "$f\n"; }测试通过,这可能是最简节的代码(除了直接调用系统的),且用了递归!这里面用了glob()函数!大大节省了代码!但如果不用glob()函数,该函数该如何写呢! 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函数的代码!也好让大家学习一下!体会一下是如何递归的! 呵呵,大概楼主要这样的代码吧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();}不过不太完美楼主领会一下,改改!!! 回ershiwuying:太没技术含量了!呵呵,不知是什么意思!有时间的话写一个有技术含量的!对# luojxun 表示感谢!您又提供了一咱思种!但你的方法也相当于用上了对象和类!不是完全函数版的方法! php毕竟是一种脚本语言,他不具有像c或c++那样强的磁盘操作能力。使用别人提供的库函数就足够了。如果你想写一个磁盘操作函数只用php而不要php提供的函数或类那是不太可能的也没有必要。如果有人可以我也希望能认识一下,呵呵 最原始的......程序递归的效率总是会比较低的,上面有用系统命令的,是个办法。$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/>'; }} 手册上说了使用in_dir前要clearstatcache 正在研究中,其实我就是想弄清当返回数组资源时,是如何递归的!比如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楼的 while ($file = readdir($handle)) {如果文件名为0.那就出错了。用循环可以解决的问题就不要用递归了。。 不好意思。因为CSDN是不能编辑的所以我发完后也不能修改。。那句话我也不知道为什么会打出来的,现在人经常傻傻的。。 俺用了zend的IDE,监控了变量,发现递规好象是用堆栈实现的但递归有的就递规不了 请问为什么不用glob呢?用glob不是更简单吗?希望帮忙解答下.我邮箱wenermail(at)gmail.com希望帮忙解答下,谢谢 zend studio 运行环境的问题 得到上一个月,在线等 <form>标签的name值有什么用? 调查,做php的朋友薪金,请说明地点,工作年限。 视频 .htaccess文件是不是不能在windows下用? 让php实现以下功能,应该怎么弄? 关于mysql的上传问题 如何把一副大的图片变成filesize小一些的图片? 郁闷,用html划表格真的好烦哦, PHP中文件上传时的判断用户是否选择文件的问题 初学php,怎么连接到数据库读出字段的内容?
各位可做一个最简单的函数,将文件夹下所有文件及子孙文件夹下
的文件路径echo出来
#一楼那个类
$direr->setupFolder($sourceFolder);
#这个方法就是用来读取某目录下所有文件夹与文件的
$direr->getFolder();
$direr->getFilePath();
#分别用来获取目录列表与文件路径列表的
$arr=system("dir /a /b /s c:\\svn\\*.*"); // *nix 下面就用 ls
print_r($arr);
SysTem128的类解决方案从理论上应是最好的!仍在研究中!俺还想请教一下,如果用PHP函数,不用类,是否也能实现遍历文件夹!而且不管是什么系统,均能有效!
<?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";
}
?>
function my_ls($path){
foreach (glob($path.DIRECTORY_SEPARATOR.'*') as $f)
echo is_dir($f) ? my_ls($f) : "$f\n";
}测试通过,这可能是最简节的代码(除了直接调用系统的),且用了递归!
这里面用了glob()函数!大大节省了代码!但如果不用glob()函数,该函数该如何写呢!
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函数的代码!也好让大家学习一下!体会一下是如何递归的!
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();
}不过不太完美楼主领会一下,改改!!!
呵呵,不知是什么意思!有时间的话写一个有技术含量的!对# luojxun 表示感谢!您又提供了一咱思种!
但你的方法也相当于用上了对象和类!
不是完全函数版的方法!
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/>';
}
}
比如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楼的
因为CSDN是不能编辑的所以我发完后也不能修改。。
那句话我也不知道为什么会打出来的,现在人经常傻傻的。。
但递归有的就递规不了
用glob不是更简单吗?
希望帮忙解答下.我邮箱wenermail(at)gmail.com
希望帮忙解答下,谢谢