2016-11-20 1 views
6

Java IO file.delete() API를 사용하여 Windows 운영 체제에서 파일을 삭제하려고했습니다. 그러나 실패하고 false를 반환합니다. 같은 코드가 우분투의 매력처럼 작동합니다.Java를 사용하여 Windows에서 파일을 삭제하지 못했습니다.

파일 권한으로 프로그램에서 삭제할 수 있음을 확인했습니다. 또한 파일에 대한 모든 입력 및 출력 스트림이 자원으로 try로 열렸습니다. 내가 테스트하고 발견 한 디버거를 사용

try (InputStream in = new FileInputStream(localFile); OutputStream out = new FileOutputStream(destinationFileName))

이 내가 API 호출을 다음과 같은 것이 true 반환 파일을 삭제 코드 라인에서.

file.exists() 
file.canRead(); 
file.canWrite(); 
file.canExecute(); 

가 난 바로 모든 스트림이 닫혀 있는지 확인하기 위해 삭제 호출하기 전에 System.gc()을 추가 노력했다.

이 정보가 도움이되는지는 확실치 않지만 아파치 commons FileUtils.forceDelete(file) 메서드를 사용해 보았는데 실패했습니다.

그래서 내가 무엇을 놓치고 있습니까?

업데이트 : Files.delete(Paths.get(file.getAbsolutePath()))를 사용하여

나는 다음과 같은 오류가 발생했습니다. file.delete()

java.nio.file.FileSystemException: C:\Users\thuvvareka\Desktop\temp\in\sd.xml: The process cannot access the file because it is being used by another process. 
    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) 
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) 
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102) 
    at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:269) 
    at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103) 
    at java.nio.file.Files.delete(Files.java:1126) 
    at org.adroitlogic.x.transport.file.FileMessageInjector.finalizeProcessing(FileMessageInjector.java:161) 
    at org.adroitlogic.x.transport.file.FileMessageInjector.afterProcess(FileMessageInjector.java:123) 
    at org.adroitlogic.x.transport.file.FileMessageInjector.afterProcess(FileMessageInjector.java:37) 
    at org.adroitlogic.x.base.trp.ScheduledMessageInjector.lambda$2(ScheduledMessageInjector.java:72) 
    at org.adroitlogic.x.api.trp.MessageReceiver.lambda$receive$3(MessageReceiver.java:100) 
    at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:760) 
    at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:736) 
    at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474) 
    at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:1962) 
    at org.adroitlogic.x.core.MessageContext.lambda$createNewResponseFuture$2(MessageContext.java:459) 
    at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:760) 
    at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:736) 
    at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474) 
    at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:1962) 
    at org.adroitlogic.x.core.MessageContext.completeMessageFlowSuccessfully(MessageContext.java:332) 
    at org.adroitlogic.x.base.connector.EgressConnectorElement.sendMessage(EgressConnectorElement.java:185) 
    at org.adroitlogic.x.base.connector.EgressConnectorElement.process(EgressConnectorElement.java:146) 
    at org.adroitlogic.x.base.processor.AbstractProcessingElement.processMessage(AbstractProcessingElement.java:103) 
    at org.adroitlogic.x.base.processor.TraceableProcessingElement.processMessage(TraceableProcessingElement.java:53) 
    at org.adroitlogic.x.base.connector.IngressConnectorElement.receiveMessage(IngressConnectorElement.java:119) 
    at org.adroitlogic.x.core.IntegrationPlatform.lambda$receive$0(IntegrationPlatform.java:81) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
+0

File.delete를()는 매우 오래된 API입니다. 당신은'Files.delete (somePath)'를 사용하려고 시도 할 수 있으므로 더 나은 에러/예외를 얻을 수 있습니다 : http://stackoverflow.com/questions/12139482/difference-between-filesdeletepath-and-filedelete – user140547

+0

업데이트했습니다. 내가 가진 예외를 가진 질문. – dammina

+0

Windows에서는 누군가 (자신의 프로세스 포함) 파일 핸들이 열려있는 파일을 삭제할 수 없습니다. 이것은 유닉스와는 다르다. 당신이 언제나 그것을 삭제할 수 있으며 (나중에 파일 설명자를 열어도). 할 수있는 일 (삭제해야하는 임시 파일 인 경우) deleteOnExit을 사용할 수 있습니다. 이는 프로세스가 열려있는 파일 스키마가있는 유일한 프로세스 일 수 있습니다. – eckes

답변

0

사용 Files.delete(filePath) 대신 file.delete() 창문에 권한에 관한 몇 가지 문제가 있습니다.

+0

질문 업데이트를 참조하십시오. – dammina

+1

이 경우 두 API간에 차이점은 없습니다. – eckes

+0

파일이 JVM에서 열렸다고합니다. 파일을 닫은 후 JVM에서 연 파일을 삭제할 수 없으므로 다시 시도하십시오. 희망이 도움이 될 것입니다. –

1

Windows에 오신 것을 환영합니다.

java.nio.file.FileSystemException: C:\Users\thuvvareka\Desktop\temp\in\sd.xml: 
The process cannot access the file because it is being used by another process. 

일반적으로 프로세스가 Windows에서 열린 파일을 가지고있을 때 운영 체제는 파일을 삭제할 수없는 방식으로 파일을 잠급니다. 파일을 삭제하려고 할 때 파일을 열어 둔 프로그램이라면 먼저 파일을 닫은 다음 삭제하십시오. 파일이 열려있는 다른 프로그램 인 경우 누가 열 었는지 파악해야합니다.

프로세스가 Linux에서 파일을 열면 일반적으로 삭제를 방해하는 요소가 없으므로 다른 동작을 보게됩니다.

0

아마도 System.Runtime.exec()을 사용하여 터미널/명령 줄 명령을 실행하여 특정 파일을 삭제할 수 있습니다. 이는 플랫폼에 따라 다를 수 있지만 exec() 함수에 입력 할 명령은 os 속성에 따라 다를 수 있습니다.

이 스레드를 검사하여 실행중인 Java 프로그램의 현재 운영 체제를 확인할 수 있습니다. 리눅스에서

How do I programmatically determine operating system in Java?

은 같은 것 당신의 라인은 다음과 같습니다

System.Runtime.exec("rm <path to file>"); 
관련 문제