2016-11-20 8 views
6

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) 
+0

File.delete()かなり古いAPIです。あなたは 'Files.delete(somePath)'を使ってみることもできますので、より良いエラー/例外を得ることができます:http://stackoverflow.com/questions/12139482/difference-between-filesdeletepath-and-filedelete – user140547

+0

私は更新しました私が持っている例外を除いて質問。 – dammina

+0

Windowsでは、誰か(自分のプロセスを含む)がファイルハンドルを開いているファイルを削除することはできません。これはUnixと異なり、いつでもそれを削除することができます(そして、開いているファイル記述子を後で使用することもできます)。あなたができること(削除すべき一時ファイルの場合)は、deleteOnExitを使用することができます。これは、あなたのプロセスが開いているファイル記述子を持つ唯一のプロセスである限り機能するかもしれません。 – eckes

答えて

0

利用Files.delete(filePath)代わりのfile.delete()file.delete()としてWindows上のいくつかの問題についての権限を持っています。

+0

質問の更新をご覧ください。 – dammina

+1

この場合、2つの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プログラムの現在のOSを特定できます。 Linuxでは

How do I programmatically determine operating system in Java?

次のように、あなたの行は次のようになります。

System.Runtime.exec("rm <path to file>"); 
関連する問題