2013-01-23 35 views
0

此方法使用递归来查找名称中包含特定字符串的文件。它在网络驱动器上进行搜索,有时必须搜索数百甚至数千个目录,才能找到所需的目录。这很慢 - 有时需要5-10秒。我怀疑这个延迟是由网络连接造成的,因为这个网络对于其他网络来说非常快。无论如何,这只是我鞭so过的东西,所以可能会有更高效的东西。有什么方法可以显着提高此文件搜索的效率?

public static File findFile(File root, String name) 
{ 
    File [] dir = root.listFiles(); 
    File a = null; 

    for(int i = 0; i < dir.length; i++) 
    { 
     if(dir[i].isDirectory() && a == null) 
      a = findFile(dir[i],name); 
     else if(dir[i].getName().indexOf(name) > -1) 
      return dir[i]; 
    } 

    return a; 
} 

那么有没有什么办法可以改善呢?或者搜索很多目录的过程总是会很慢?谢谢。

+2

五到十秒很不错。我看到Windows资源管理器搜索花费的时间比这更长。 –

+0

存在一个明显的问题:即使找到文件,搜索也不会停止。 –

+0

当findFile在递归之外被调用时,根是否总是相同? – dchhetri

回答

0

在大型目录结构中,搜索必须花费更长的时间。如果您需要速度,请考虑基于索引的方法(构建并动态更新文件名的索引,并且只在其中进行查找)。

这正是Linux locate命令的工作原理,并且其搜索立即生效。

1

这可能是矫枉过正,但考虑建立一个index

就我个人而言,我曾经使用Apache Lucene来索引各种网络资产,包括图像文件,PDF,html等等。使用Lucene 4.1,添加索引以及搜索索引非常简单。

一个文件夹(和所有子文件夹)添加到索引

要启动,这是很简单,在你的网络驱动器都添加到索引:

的Java org.apache.lucene .demo.IndexFiles -docs {路径至文件夹}

搜索索引

一旦你添加了所有必需的文件到你的索引,您可以使用Lucene的库提供的搜索索引来搜索文件:

IndexSearcher.search(query, n) 

有配置的无限可能,你不局限于仅仅搜索文件名。

+0

这不是我所熟悉的东西,但当我有机会时,我会检查它。谢谢。 – ericjv

相关问题