我需要提供用户整个硬盘的文件夹选择(脚本在用户PC上运行)。从该列表中,用户可以选择一个或多个文件夹。我正在使用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个进程是问题,因为我基本上是从创建者教程中复制它。我认为在列出文件夹的过程中我犯了一个错误。
使用带有少量文件夹的硬盘驱动器参数运行getDirectory脚本,它就像魅力一样。当谈到(通常)具有大量嵌套文件夹的硬盘时,它会持续几分钟。
有人知道列出文件夹的更好方法,还是提供完整的不同解决方案来呈现服务器端文件夹创建对话框?
答案 0 :(得分:0)
完全不同的方法是使用PHP仅获取特定文件夹的内容(无递归)。如果您使用AJAX进行递归并深入浏览目录结构,则可以并行执行此操作。
我认为这会大大提高速度。此外,您可以显示已经很快就能看到数据的所有内容,即使它没有完成。
答案 1 :(得分:0)
如果你抱怨速度,我会建议Lazy Loading。如果要加载目录中的每个文件夹/文件,它将变得非常慢。