2013-11-02 2 views
3

디렉토리의 모든 파일을 반복하여 삭제하는 다음 Java 코드가 있습니다.Java File.delete()가 모든 파일을 삭제하지 않습니다.

그러나 모든 파일을 삭제하지는 않습니다. 내가 이것을 할 때, 보통 20 ~ 30 명 중 몇 명이 뒤쳐져 있습니다. 이 문제를 해결할 수 있습니까? 아니면 혼자 남겨 두는 Java 부두를 발견했을까요?

+2

어쩌면 당신은 파일을 삭제할 수있는 권한이 없습니다. 또는 잠겨 있거나 다시 만들어 지거나 다른 것이 생깁니다. 삭제가 성공했는지 여부를 알기 위해 반환 값을 확인하십시오. 또한 삭제하려면 디렉토리가 비어 있어야한다고 생각하십시오. –

+0

오류가 있습니까? 어떤 파일이 삭제되지 않습니까? – WhileTrueSleep

+1

모든 파일을 수동으로 삭제할 수 있습니까? 일부 프로그램이 다른 프로그램을 사용하기도합니다. 예외를 잡으려고 시도하십시오 : _ "Files 클래스는 파일을 삭제할 수 없을 때 IOException을 throw하는 delete 메소드를 정의합니다. 이는 오류보고 및 파일을 삭제할 수없는 이유를 진단하는 데 유용합니다."_ –

답변

3

System.gc();을 사용하여 가비지 수집기를 강제 실행하면 모든 파일을 삭제할 수 있습니다.

+1

이것은 해결책이지만이 작업을 수행하는 것이 "괜찮습니까"? – Mafro34

+1

닫는 것을 잊은 파일을 찾을 때까지이 문제가 발생했습니다. 평상시와 같이 원하는 동작을 위해 가비지를 수집해야하는 경우 자원 누출이 있습니다. –

+0

하지만 System.gc() 호출; 쓰레기 수거가 잠시 일어나는 것을 보장하지 않습니다. –

10

boolean 값을 반환하면 확인해야합니다. JavaDoc에서 :

반환 : 파일 또는 디렉토리가 성공적으로 삭제 된 경우에만 true입니다. 그렇지 않으면 false

반환 값을 확인하고 조치를 취해야합니다.

false을 반환하면 파일을 삭제할 수있는 권한이없는 것일 수 있습니다.

이 경우 응용 프로그램에서 파일을 쓸 수 있는지 여부를 확인할 수 있으며 쓰기가 가능하지 않은 경우 다시 boolean을 반환합니다. 성공하면 다시 삭제할 수 있습니다. 나는 또한 JavaDoc을 자신의 조언을 걸릴 것

private void deleteFile(final File f) throws IOException { 
    if (f.delete()) { 
     return; 
    } 
    if (!f.canWrite() && !f.setWritable(true)) { 
     throw new IOException("No write permissions on file '" + f + "' and cannot set writeable."); 
    } 
    if (!f.delete()) { 
     throw new IOException("Failed to delete file '" + f + "' even after setting writeable; file may be locked."); 
    } 
} 

:

당신은 유틸리티 방법을 사용할 수있는 IOException가 던져

참고 파일 클래스가 삭제 방법을 정의하는을 때 파일을 삭제할 수 없습니다. 이는 오류 보고 및 파일을 삭제할 수없는 이유를 진단 할 때 유용합니다.

Java 7을 사용하는 경우. Oracle tutorial page에서 촬영

try { 
    Files.delete(path); 
} catch (NoSuchFileException x) { 
    System.err.format("%s: no such" + " file or directory%n", path); 
} catch (DirectoryNotEmptyException x) { 
    System.err.format("%s not empty%n", path); 
} catch (IOException x) { 
    // File permission problems are caught here. 
    System.err.println(x); 
} 

예 : 그 방법은 당신이 처리 할 수있는 예외의 수를 던졌습니다.

+1

나는 왜 사람들이 이것을 상상하지 않는지 모르겠다. 그것은 OP의 질문에 대답하지 않습니다, 그것은 의견에 더 적합합니다. –

+0

거기에 약 절반 방법을 얻을 – clwhisk

+1

나는 이것을 시도했지만 false를 반환하지 않으므로 파일을 삭제할 때 "오류"가 발생하지 않습니다. 루프가 반복하고 삭제할 때 파일이 보이지 않는 것 같습니다. – user1049697

0

BufferedReader/Writer, FileReader/Writer 등 열린 스트림이 없는지 확인하십시오. 먼저 파일을 닫으면 파일을 삭제할 수 있습니다. 다시 한 번 예를 들어 FileReader와 같은 다른 판독기를 통해 BufferedReader를 여는 경우 별도로 두 판독기를 모두 닫아야합니다. 그래서 그 대신이의

:

BufferedReader reader = new BufferedReader(new FileReader(new File(filePath));); 

이 작업을 수행 :

BufferedReader bufferedReader = null; 
FileReader fileReader = null; 

try{ 
    fileReader = new FileReader(readFile); 
    bufferedReader = new BufferedReader(fileReader); 

}catch{...} 

... 

try { 
    fileReader.close(); 
    bufferedReader .close(); 
    readFile.delete(); 
} catch (IOException e) { 
    e.printStackTrace(); 
}