哪位大吓能够帮我写一个函数,能够遍历一个文件夹下的所有文件和子文件夹,并依据树状结构生成数组。100分

javasai 2009-01-08 05:11:13
很急哟。。
...全文
1651 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
kim201119 2009-02-02
  • 打赏
  • 举报
回复
什么跟什么》?
树都遍历都是递归出来都。
testoktest 2009-01-22
  • 打赏
  • 举报
回复
spl几个扩展还有点意思

$dir = new RecursiveDirectoryIterator("./");
foreach(new RecursiveIteratorIterator($dir) as $path) {
echo $path,'<br>';
}

RecursiveDirectoryIterator继承了DirectoryIterator,里面能搞的东西不少,搞一搞生成数组应该没问题吧
不递归直接用DirectoryIterator
我都没有搞过……
cloud976 2009-01-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hzcenter 的回复:]
引用 9 楼 hzcenter 的回复:
文件夹遍历最好不要用递归. 性能差且目录层次过深时有可能造成程序溢出空间栈.

如果想逐层遍历, 可使用队列. 使用下面的算法:

0. 顶层文件夹入队列
1. 若队列为空, 则退出;
2. 出队一个节点, 用SetCurrentDirectroy将文件夹置为当前目录
3. hff=FindFirstFile(TEXT(*.*), &wfd);
if(INVALID_HANDLE_VALUE!=hff)
do
{
if(wfd.dwFileAttribute&FILE_ATTRIBUTE_DIRECTORY)
{
生成一个全…
[/Quote]

呵呵,说的不错,如果递归的目录结构比较复杂会容易引起栈溢出,用队列,十字链表或者字典实现都是比较方便的方法。
frj000 2009-01-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 hqaht 的回复:]
PHP code
function showDirectoryFile($path){
$handle = opendir($path);
while($file = readdir($handle)){
if($file=="."||$file=="..") continue;
$newFilePath = $path.DIRECTORY_SEPARATOR.$file;
if(is_dir($newFilePath)){
echo "文件夹:".$newFilePath."<br>";
showDirectoryFile($newFilePath);
}
if(is_file($newFilePath)) ech…
[/Quote]

正解
hzcenter 2009-01-10
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 hqaht 的回复:]
1楼的方法没有测试,有错误,现修改如下:

PHP code
function sdir($dir){
$files = scandir($dir);
for ($i=0;$i <count($files);$i++){
if ($files[$i]=='.' or $files[$i]=='..') unset($files[$i]);
if (is_dir($files[$i])) $files[$i]=sdir($files[$i]);
}
return $files;
}
[/Quote]

赫赫,就return写错了!

我也没有测试的,不过大概就是这样的方法比较好理解。

还有就是我上面提到的另外一个算法。
那个的算法,效率会好一点!
kocoguan2 2009-01-09
  • 打赏
  • 举报
回复
关注。。。
helloyou0 2009-01-09
  • 打赏
  • 举报
回复
咳咳,楼上代码碰到 目录名 为 '0' 的会出错 .....
helloyou0 2009-01-09
  • 打赏
  • 举报
回复
基于楼上的code



$results=array();

$path = "/root";
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $key => $val)
{
$s=pathinfo(trim(str_replace($path,'',$val),'/'));
$x=(!empty($s['dirname'])&&$s['dirname']!='.')?"['".str_replace('/',"']['",$s['dirname'])."']":'';
eval('$results'.$x."[]='".$s['basename']."';");
}

print_R($results);

liuenhai211 2009-01-09
  • 打赏
  • 举报
回复
UP!
hqaht 2009-01-09
  • 打赏
  • 举报
回复

function showDirectoryFile($path){
$handle = opendir($path);
while($file = readdir($handle)){
if($file=="."||$file=="..") continue;
$newFilePath = $path.DIRECTORY_SEPARATOR.$file;
if(is_dir($newFilePath)){
echo "文件夹:".$newFilePath."<br>";
showDirectoryFile($newFilePath);
}
if(is_file($newFilePath)) echo "文件:".$newFilePath."<br>";
}
closedir($handle);
}
showDirectoryFile("/usr/local/");
//DIRECTORY_SEPARATOR:路径分隔符,linux上就是’/’ windows上是’\’
//PATH_SEPARATOR:include多个路径使用,在win下,当你要include多个路径的话,你要用”;”隔开,但在linux下就使用”:”隔开的。

这个不错 楼主可以试一下
hqaht 2009-01-09
  • 打赏
  • 举报
回复
1楼的方法没有测试,有错误,现修改如下:

function sdir($dir){
$files = scandir($dir);
for ($i=0;$i <count($files);$i++){
if ($files[$i]=='.' or $files[$i]=='..') unset($files[$i]);
if (is_dir($files[$i])) $files[$i]=sdir($files[$i]);
}
return $files;
}
chen870201 2009-01-09
  • 打赏
  • 举报
回复
关注下
jumpheightway 2009-01-09
  • 打赏
  • 举报
回复
去这里看看
http://home.lampbrother.net/space.php?uid=10148&do=blog&id=846
free999 2009-01-09
  • 打赏
  • 举报
回复
如果你只是要生成树结构,建议用ajax吧,全部读取,然后生成树,php慢,javascript也慢,给客户的体验也不好
fxs_2008 2009-01-09
  • 打赏
  • 举报
回复

写一个吧,大家测一测


<pre>
<?php

//creator:fxs_2008@sina.com

function get_all_files($path) {
$list = array();
foreach(glob($path . '\*') as $item) {
// 如果是文件
if (is_dir($item)) {
$list[basename($item)] = array_merge($list , get_all_files($item));
} else {
//如果是目录
$list[] = $item;
}
}

return $list;
}

print_r(get_all_files('D:\PHP\www\zzxj\blog'));

?>
</pre>

版权所有啊,引用请注明来源:http://www.zzxj.net/forum


hzcenter 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hzcenter 的回复:]
文件夹遍历最好不要用递归. 性能差且目录层次过深时有可能造成程序溢出空间栈.

如果想逐层遍历, 可使用队列. 使用下面的算法:

0. 顶层文件夹入队列
1. 若队列为空, 则退出;
2. 出队一个节点, 用SetCurrentDirectroy将文件夹置为当前目录
3. hff=FindFirstFile(TEXT(*.*), &wfd);
if(INVALID_HANDLE_VALUE!=hff)
do
{
if(wfd.dwFileAttribute&FILE_ATTRIBUTE_DIRECTORY)
{
生成一个全路径的字…
[/Quote]

只是一个算法,一个思路,你可以用php实现这个算法。

算法不是说只适合c++或者php才能使用的。
cymple 2009-01-08
  • 打赏
  • 举报
回复
glob
fxs_2008 2009-01-08
  • 打赏
  • 举报
回复
查查有没有相关函数
kfjfox 2009-01-08
  • 打赏
  • 举报
回复
xiaojie515 2009-01-08
  • 打赏
  • 举报
回复
<?php

$path = "../";
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $key => $val)
{
echo $key . '=>' . $val .'<br>';
}

?>

这个可以遍历目录下所有得文件,php5以上才支持
加载更多回复(7)

4,250

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧