2012-10-16 2 views
0

어떤 디렉토리 또는 드라이브에있을 수있는 파일을 검색해야합니다. 모든 운영 체제와 호환되어야합니다. 내가봤을 때, 대부분의 코드는 특정 디렉토리를 통해 반복되지만 전체 파일 시스템은 반복하지 않습니다. 효율적으로 할 수있는 방법이 있습니까? 어떤 도움이나 제안도 정말 감사 할 것입니다.Java가 모든 디렉토리를 탐색하고 파일을 찾습니다.

아래 코드는 내가 http://www.mkyong.com/java/how-to-traverse-a-directory-structure-in-java/에서 가져 왔지만 매개 변수로 일부 디렉토리를 전달해야합니다. 모든 위치를 얻기 위해 일반화 할 수있는 방법이 있습니까?

public static void main (String args[]) { 

    displayIt(new File("C:\\")); 
} 

public static void displayIt(File node){ 

    System.out.println(node.getAbsoluteFile()); 

    if(node.isDirectory()){ 
     String[] subNote = node.list(); 
     for(String filename : subNote){ 
      displayIt(new File(node, filename)); 
     } 
} 
+0

이 예제에서는 시작 디렉토리 만 변경할 수 있습니다. 재귀에는 항상 시작점 (루트 노드라고 함)이 있습니다. – jondinham

답변

3

Apache Commons-IO는 이러한 종류의 작업에 적합한 API입니다. 유닉스 시스템의 경우 그냥 루트를 사용할 수 있습니다 "/"그러나이 창문하지 않을 것이다, 따라서 당신은 그들을 모두 뿌리를 요청하고 반복해야합니다 :

File[] roots = File.listRoots(); 

Collection<File> files = new ArrayList<File>();  

for(File root : roots) { 
    files.addAll(FileUtils.listFiles(
     root, 
     new RegexFileFilter(<your regex filter>), 
     DirectoryFileFilter.DIRECTORY 
    )); 
} 
1

코드 이런 종류의 모든 파일을 나열합니다 디렉토리 및 하위 디렉토리에 있습니다. allFiles에 파일을 추가하지 않아도됩니다. 아직 코드를 제공 havent 한 것처럼 나는 당신이 그것을 업데이트 할 수 있습니다 (그래서 당신이 시도 아무것도를 havent 가정))

private void addFiles(File file, Collection<File> allFiles) { 
    File[] files = file.listFiles(); 
    if (files != null) { 
     for (File f : files) { 
      allFiles.add(f); 
      addFiles(f, allFiles); 
     } 
    } 
} 
+0

그 아이디어는 분명합니다. 나는 똑같은 제안을하고 싶지만 코드에 실수가있는 것 같습니다 : 메소드 매개 변수는 사용하지 않는 것 같습니다 : 항상 루트 폴더를 통해 반복합니다. – Wizart

0

당신이 재귀하여이 작업을 수행하려면, 여기 DFS에 대한 코드는 코드는 그렇지 않을 수 있습니다 (테스트하지 않음) 최적화되지 않았지만 문제를 해결하는 방법을 알려줄 수 있습니다.

File find(String directoryName, String pattern) 
{ 
File currentDirectory = loadFile(directoryName); 

for (String name: currentDirectory .list()) 
{ 
File children = loadFile(name) 

if (children.isDirectory()) 
{ 
File file = find(name, pattern) 
if (file !=null) 
{ 
    return file; 
} 
} 
else 
{ 
if (match(name,pattern) 
    { 
    return children; 
    } 
} 
} 
return null; 

} 
관련 문제