0

このメソッドは、再帰を使用して、名前に特定の文字列を含むファイルを見つけます。ネットワーク ドライブを検索しており、探しているものを見つける前に、数百または数千のディレクトリを検索する必要がある場合があります。かなり遅く、5 ~ 10 秒かかることもあります。このネットワークは他のすべてのものに対して非常に高速であるため、遅延がネットワーク接続によって引き起こされているとは思えません. とにかく、これは私が作り上げたものなので、おそらくもっと効率的なものがあるでしょう.

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;
}

それで、これを改善する方法はありますか?それとも、多くのディレクトリを検索するプロセスは、常にそれほど遅くなるのでしょうか? ありがとう。

4

2 に答える 2

1

これはやり過ぎかもしれませんが、 indexの構築を検討してください。

個人的には、過去にApache Luceneを使用して、画像ファイル、PDF、html など、あらゆる種類の Web アセットのインデックスを作成しました。Lucene 4.1 では、インデックスへの追加とインデックスの検索が非常に簡単です。

フォルダー (およびすべてのサブフォルダー) をインデックスに追加する

まず、ネットワーク ドライブ内のすべてのものをインデックスに追加するのは非常に簡単です。

java org.apache.lucene.demo.IndexFiles -docs {フォルダーへのパス}

インデックスを検索

インデックスに必要なすべてのファイルを追加したら、Lucene ライブラリが提供する検索インデクサーを使用してドキュメントを検索できます。

IndexSearcher.search(query, n)

構成には無限の可能性があり、ファイル名の検索だけに限定されません。

于 2013-01-23T21:06:46.683 に答える
0

大きなディレクトリ構造では、検索に時間がかかります。速度が必要な場合は、インデックスベースのアプローチを検討してください (ファイル名のインデックスを構築して動的に更新し、その中でルックアップのみを行います)。

これはまさに Linuxlocateコマンドがどのように機能するかであり、その検索は即座に行われます。

于 2013-01-23T20:57:43.130 に答える