2016-07-14 11 views
0

Windowsで特定のファイルパスを見つける方法はありますか?たとえば、私のローカルでputty.exeの場所を探したいとしたら、完全なファイルパスを得る方法はありますか? apache commons-ioユーティリティを使用して次のコードを試しましたが、ローカルにたくさんのファイルがあるので、時間がかかります。Javaを使用しているウィンドウでファイルパスを見つける

File dir = new File("C:\\"); 

String[] extensions = new String[]{"exe"}; 
IOFileFilter filter = new SuffixFileFilter(extensions, IOCase.INSENSITIVE); 

List<File> fileList = (List<File>) FileUtils.listFiles(dir, filter, DirectoryFileFilter.DIRECTORY); 

System.out.println("file list size "+fileList.size()); 
for (File file : fileList) { 
    if (file.getName().toLowerCase().contains("putty")) { 
     System.out.println(file.getPath()); 
    } 
} 

もう少し速い方法がありますか?

編集私は特にputty.exeを見つけたいです。

+0

が行われていますか?それがPATHにある場合は実行され、そうでない場合はディスク全体を見る必要があります。 – EJP

+0

ローカルでEXEを実行するロジックを作成する必要がありますが、ファイルがどこにあるかわかりません。異なるユーザーの場合は、パスが異なる場合があります。そのため、ファイルパスを見つけて実行する必要があります。 –

+0

それは私の主張です。それがPATH上にあるかどうかを知る必要はありません。 – EJP

答えて

0

必要なファイルを探してディスク全体をスキャンするプログラムはこれまでにないと予想されます。

プログラムは、次のいずれかの方法を使用します。PATH環境変数内のディレクトリで

  1. 見て、実行可能
  2. を探しているが、インストール時にファイルの場所を提供することをユーザに要求する場合とそれらを既知のどこかに保管してください。これはプログラムのホームディレクトリに格納されている.iniファイルです。 Windowsの場合:システムレジストリまたはUserまたはSystem環境変数(レジストリにも終わる)。
  3. インストーラは、プログラムによって読み取られるアプリケーション固有の環境変数を設定するランチャシェルスクリプトを作成します。

おそらく私が考えていないいくつかの他のものがあります。このアイデアは、プログラムが検索する場所を制限することです。

+0

私のコードは多くの異なるユーザーによって実行されます。それらのそれぞれは、どこに言及された経路も持たないでしょう。たとえば私のローカルで。私はダウンロードでこの特定の.exeファイルを持っていますが、これは他のユーザーの場合と異なる場合があります。だから私はファイルを見つけるための共通のシナリオを持っていない。私が知っているのはファイル名だけです。 –

+0

次に、検索中に忍耐強くなるように指示するか、指示するようにユーザーに指示する必要があります。そしてあなたがそれを見つけたら、あなたがいつも取り戻すことができる場所を固定してください。 –

0

通常の方法で実行可能ファイルをインストールすると、PATH変数に格納されます。

public static Optional<Path> exePath(String exeName) { 
    String pathVar = System.getenv("PATH"); 
    Pattern varPattern = Pattern.compile("%(\\w+)%"); 
    boolean tryVars = true; 
    while (tryVars) { 
     tryVars = false; 
     Matcher m = varPattern.matcher(pathVar); 
     StringBuffer sb = new StringBuffer(); 
     while (m.find()) { 
      tryVars = true; 
      m.appendReplacement(sb, System.getenv(m.group(1))); 
     } 
     m.appendTail(sb); 
     pathVar = sb.toString(); 
    } 
    String[] dirs = pathVar.split("\\s*;\\s*"); 
    for (String dir : dirs) { 
     Path path = Paths.get(dir, exeName); 
     if (Files.exists(path)) { 
      return Optional.of(path); 
     } 
    } 
    return Optional.empty(); 
} 

System.out.println(exePath("java.exe")); 

はおそらくVARパターン置換がどのような目的のために、自動的に(%JAVA_HOME%以下とな)

+0

一部のexeファイルがインストールされていません。パテのように。私がダウンロードすると、 'PATH'変数にパスが記述されていない' .exe'ファイルが直接取得されます。 –

+0

***大丈夫です。*** PATH +パテ* \ putty.exe'のような試みですか?ダウンロードディレクトリを追加しますか?ユーザーのディレクトリツリー全体をスキャンしますか? ***おそらくそうではありません。***パテはいくつかのファイルタイプを登録しているとは思わないので、 'Desktop.getDestop.open(file)'はパテを起動します。しかし、Windowsには機能があります。 Windowsにはオプションのファイルインデックス作成と検索機能があります。 ** regedit **がありますが、これは単にputtyのエントリを保持するかもしれませんが、管理者以外のすべての人がアクセスできるわけではありません。多分誰かが知っているでしょう。 –

+0

'Desktop.getDesktop()。open(file)'は、ファイルがどこにあるかを知っているときにのみファイルを実行します。私の大きな問題は、すべてのユーザーにとって、パスが同じでない可能性があるということです。:( –

関連する問題