0

我需要提供用户整个硬盘驱动器的文件夹选择(脚本在用户电脑上运行)。从该列表中,用户可以选择一个或多个文件夹。我正在使用 jquery 库 dynatree ( http://code.google.com/p/dynatree/ ) 进行演示。

我的脚本是这样工作的:

1.列出指定驱动器号或路径的所有文件夹,并通过此递归函数将其解析为Dynatree可读格式:

代码:

function getDirectory( $path = '.', $level = 0, $id = 0){ 
$ignore = array( 'cgi-bin', '.', '..' , 'windows', 'user_folders', 'user_profiles'); 
$dh = @opendir( $path ); 
$zaehl = 0; 
if($level != 0) echo(', children: [ ');
while( false !== ( $file = readdir( $dh ))){ 
$zaehl++;
      if( !in_array( strtolower($file), $ignore ) ){ 
        $spaces = str_repeat( ' ', ( $level * 4 ) ); 
        if( is_dir( "$path/$file" ) ){
        echo('{title: "'.$file.'", isFolder: true, key: "'.$path.'/'.$file.'"');
    echo("\n"); 
            getDirectory( "$path/$file", ($level+1), $id.'.'.$zaehl); 
    echo('},');
    echo("\n");

        }       

    } 

} 
 if($level != 0)
    {
        echo(']');
    }
closedir( $dh ); 
} 

2.使用Dynatree展示列表:

        $("#tree3").dynatree({

        checkbox: true,

        selectMode: 3,

        children: treeData,

        onSelect: function(select, node) {

            var selKeys = $.map(node.tree.getSelectedNodes(), function(node){

                return node.data.key;

            });
            var selRootNodes = node.tree.getSelectedNodes(true);
            var selRootKeys = $.map(selRootNodes, function(node){
                return node.data.key;
            });
            $("#echoSelectionRootKeys3").text(selRootKeys.join(", "));
            $("#echoSelectionRoots3").text(selRootNodes.join(", "));
        },
        onDblClick: function(node, event) {
            node.toggleSelect();
        },
        onKeydown: function(node, event) {
            if( event.which == 32 ) {
                node.toggleSelect();
                return false;
            }
        }
    });

我不认为进程号 2 是问题,因为我基本上是从创作者教程中复制的。我认为我在列出文件夹的过程 1 中犯了一个错误。

使用带有几个文件夹的硬盘驱动器参数运行 getDirectory 脚本,它就像一个魅力。当涉及到(通常)具有大量嵌套文件夹的硬盘时,它会持续几分钟。

有没有人知道列出文件夹的更好方法或用于呈现服务器端文件夹创建对话框的完全不同的解决方案?

4

2 回答 2

0

一种完全不同的方法是使用 PHP 仅获取特定文件夹的内容(无递归)。如果您使用 AJAX 进行递归并深入浏览您的目录结构,您可以并行执行。

我认为这将大大提高速度。此外,您可以展示每个人都会很高兴这么快看到数据的东西,即使它没有完成。

于 2012-04-16T16:58:33.330 回答
0

如果您抱怨速度,我建议您使用Lazy Loading。如果您正在加载目录中的每个文件夹/文件,它将变得非常慢。

于 2012-04-18T12:44:08.863 回答