2014-09-18 2 views
0

폴더 및 하위 폴더의 특정 확장자를 가진 파일을 카운트하는 코드를 작성하고 있습니다. 이 코드는 작고 큰 큰 폴더에서 계산할 때 잘 작동합니다.디렉토리 및 하위 디렉토리 (예 : 루트 C : // 또는 D : //)에서 많은 수의 파일 수를 계산하는 방법

루트에서 계산하면 문제가 시작됩니다 (예 : D : //). 몇 시간 동안 계산되지만 중간에 멈추십시오. 나는 코드가 많은 수의 파일과 폴더를 읽는 것이 효율적이지 않다고 가정합니다.

public static int countFiles(File directory, String ext) { 
    int count = 0; 

    for(File file : directory.listFiles()) { 
     System.out.println(file); 
     if(file.isDirectory()) { 
      count += countFiles(file, ext); 
     } 
    String textFile = file.toString(); 
    if(textFile.endsWith(ext)){ 
     count++; 
    } 
    } 

오류 표시 enter image description here

스크린 샷 회선 이상 여기

enter image description here

+1

'File'이 유효한 파일 참조가 아니면 'listFiles'를 호출하면'null '결과가 반환됩니다. 'File # exists'를 사용하면 디렉토리를 읽기 전에'File' 레퍼런스가 존재하는지 여부를 확인할 수 있습니다 ... 또한'File'은 지름길이나 심볼릭 링크 (또는 함수 조인트 나 윈도우즈 스페셜 등)를 좋아하지 않습니다 폴더) – MadProgrammer

+0

라인 77과 79는 어느 라인입니까? – immibis

+0

@MadProgrammer는 여전히 충분하지 않습니다. 다른 프로그램이'exists' 체크 후에'listFiles' 전에 파일을 삭제할 수 있기 때문입니다. – immibis

답변

1

내가 생각하는 것은 directory.listFiles()이 null을 반환한다는 것입니다.

설명서에 언급되어 있지는 않지만 디렉토리 내용을 나열 할 수있는 충분한 액세스 권한이없는 경우 이런 일이 발생할 수 있습니다. 다음과 같이 쉽게 수정할 수 있습니다.

또한 명확하게 그렇지 않은 경우 예를 들어 Files ending with .xls이라는 디렉토리가 파일로 계산 될 수 있다는 점에서 약간의 논리 오류가 있습니다. 나는 이것을 고쳤다.

public int countFiles(File directory, String... exts) { 
    int count = 0; 
    File[] files = directory.listFiles(); 
    if (files != null) { 
    for (File file : files) { 
     if (file.isDirectory()) { 
     count += countFiles(file, exts); 
     } else { 
     String textFile = file.toString(); 
     for (String ext : exts) { 
      if (textFile.endsWith(ext)) { 
      count++; 
      } 
     } 
     } 
    } 
    } 
    return count; 
} 
0

나는 카운트 파일의 시작 부분에서 단순히 null을 확인합니다.

public int countFiles(File directory, String... exts) { 
    if (directory == null) return 0; 

는 전체 파일 시스템의 큰 순환 스캔을하고 있다면 - 그것은 디렉토리가 더 이상 시간 countFiles(file, exts); 사이에 존재하지 않는 수 있다는 의미가 호출되고 directory.listFiles()가 호출 될 때.

관련 문제