Java IO file.delete()
APIを使用してWindowsオペレーティングシステムでファイルを削除しようとしました。しかし、それは失敗し、falseを返します。同じコードは、Ubuntuの魅力のように機能します。Javaを使用してWindowsでファイルを削除できません
ファイルのアクセス許可によってプログラムが削除できることを確認しました。また、ファイルの入力ストリームと出力ストリームは、すべてリソースのtryとしてオープンされています。私がテストしたと私は、ファイルを削除するコードの行でそれがAPI呼び出しを以下のためtrue
を返すことを見出したデバッガを使用して
try (InputStream in = new FileInputStream(localFile); OutputStream out = new FileOutputStream(destinationFileName))
。
file.exists()
file.canRead();
file.canWrite();
file.canExecute();
は、私も右のすべてのストリームが閉じられていることを確認するために削除を呼び出す前
System.gc()
を追加しようとしています。
これは参考になる情報なのかどうかわかりませんが、私はApacheコモンズFileUtils.forceDelete(file)
メソッドの使用を試みたこともあり、失敗しました。
ここで私は何が欠けていますか?
更新:Files.delete(Paths.get(file.getAbsolutePath()))
を使用することにより
は、私は次のエラーを得ました。
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)
File.delete()かなり古いAPIです。あなたは 'Files.delete(somePath)'を使ってみることもできますので、より良いエラー/例外を得ることができます:http://stackoverflow.com/questions/12139482/difference-between-filesdeletepath-and-filedelete – user140547
私は更新しました私が持っている例外を除いて質問。 – dammina
Windowsでは、誰か(自分のプロセスを含む)がファイルハンドルを開いているファイルを削除することはできません。これはUnixと異なり、いつでもそれを削除することができます(そして、開いているファイル記述子を後で使用することもできます)。あなたができること(削除すべき一時ファイルの場合)は、deleteOnExitを使用することができます。これは、あなたのプロセスが開いているファイル記述子を持つ唯一のプロセスである限り機能するかもしれません。 – eckes