2012-05-28 21 views
6

Javaで特定の名前のディレクトリを見つける最良の方法は何ですか?私が探しているディレクトリは、現在のディレクトリまたはそのサブディレクトリのいずれかに置くことができます。Javaでディレクトリを再帰的に検索する

+3

は[あなたは何を試してみました?](http://www.whathaveyoutried.com/)または、むしろ、考えることができる最良の2(肩をすくめた)アプローチを試すことに基づいて、あなたの理論は何ですか?あるいは、この質問は実際には「あなたは私にコードを教えてもらえますか?」という意味ですか? –

答えて

2

あなたのソリューションは、File.listFiles(String)

java.io.File API reference

+0

Andrewに感謝します。私は1.6に制限されていますが、他の人はそうではないことを忘れています。 – MadcoreTom

+0

* "私は1.6に制限されています" *私は(1.5 dev。ラッキーなドキュメント。 '@ since'タグを持っています。コンパイラにはバージョン互換性の '酸テスト'としてのクロスコンパイルオプションがあります。 Java 1.3用に開発していると言われても、私は最新のJava Docsにリンクしています。 ;) –

0

分割の使用を含むと征服のだろうか?単純なアプローチは:

  1. リストリストには、アプリケーション
  2. タスクを開始し、一致するディレクトリ、プリントを含んでおり、終了している場合、すべてのディレクトリ
  3. :すべてのディレクトリについては、タスクを開始することができ、それは以下を行いすべてのディレクトリに対して。
4

ファイルツリーを歩くには、FileVisitorインターフェイスを使用できます。 tutorialをご覧ください。 Find sample codesも参照してください。

+0

これは、@ MadcoreTomの#listFilesより優れた解決策です。ファイルが見つかるとwalkを終了させることができます。 – Kong

0

何かのように:

public static final File findIt(File rootDir, String fileName) { 
    File[] files = rootDir.listFiles(); 
    List<File> directories = new ArrayList<File>(files.length); 
    for (File file : files) { 
     if (file.getName().equals(fileName)) { 
      return file; 
     } else if (file.isDirectory()) { 
      directories.add(file); 
     } 
    } 

    for (File directory : directories) { 
     File file = findIt(directory); 
     if (file != null) { 
      return file; 
     } 
    } 

    return null; 
} 
2

あなたは再帰がstreams APIを経由して、この要件のJava 8で

import java.io.File; 

public class CheckFile { 

    private static boolean foundFolder = false; 

    public static void main(String[] args) { 
     File dir = new File("currentdirectory"); 
     findDirectory(dir); 
    } 

    private static void findDirectory(File parentDirectory) { 
     if(foundFolder) { 
      return; 
     } 
     File[] files = parentDirectory.listFiles(); 
     for (File file : files) { 
      if (file.isFile()) { 
       continue; 
      } 
      if (file.getName().equals("folderNameToFind")) { 
       foundFolder = true; 
       break; 
      } 
      if(file.isDirectory()) { 
       findDirectory(file); 
      } 
     } 
    } 

} 
+0

このメソッドは再利用できない(いくつかのユーティリティクラスに移動すると動作しない)、つまり一度だけフォルダを検出でき、一度検出された 'foundFolder'はtrueのままであることがわかりますか? –

5

に応えるべきで述べたように:

Optional<Path> hit = Files.walk(myPath) 
    .filter(file -> file.getFileName().equals(myName)) 
    .findAny(); 

#walkは、怠惰ですどんなshort-circuiting terminal operationでも必要なIOを最適化します。

+0

これは 'Path.getFileName'の' java.nio.Path'を 'String'と比較します。私は 'file.getFileName()。toFile.getName()'がこれが複雑で多分高価かもしれないことを知っていることをお勧めします。 –

0

それとも、それが発見されるまでは、ファイルを検索再帰的という概念を使用する必要があります。ここではコードです:

String name; //to hold the search file name 

public String listFolder(File dir) { 
    int flag; 
    File[] subDirs = dir.listFiles(new FileFilter() { 
     @Override 
     public boolean accept(File pathname) { 
      return pathname.isDirectory(); 
     } 
    }); 
    System.out.println("File of Directory: " + dir.getAbsolutePath()); 
    flag = Listfile(dir); 
    if (flag == 0) { 
     System.out.println("File Found in THe Directory: " + dir.getAbsolutePath()); 
     Speak("File Found in THe Directory: !!" + dir.getAbsolutePath()); 
     return dir.getAbsolutePath(); 
    } 
    for (File folder : subDirs) { 
     listFolder(folder); 
    } 
    return null; 
} 

private int Listfile(File dir) { 
    boolean ch = false; 
    File[] files = dir.listFiles(); 
    for (File file : files) { 
     Listfile(file); 
     if (file.getName().indexOf(name.toLowerCase()) != -1) {//check all in lower case 
      System.out.println(name + "Found Sucessfully!!"); 
      ch = true; 

     } 
    } 
    if (ch) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 
関連する問題