Échec de la suppression d’un fichier dans Windows en utilisant Java

J’ai essayé de supprimer un fichier dans le système d’exploitation Windows à l’aide de l’API de file.delete() Java IO file.delete() . Cependant, il échoue et renvoie false. Le même code fonctionne comme un charme dans Ubuntu.

J’ai vérifié que les permissions du fichier permettent au programme de le supprimer. En outre, tous les stream d’entrée et de sortie du fichier ont été ouverts en tant qu’essai avec les ressources.

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

En utilisant un débogueur, j’ai testé et découvert qu’à la ligne de code que je supprime le fichier, il renvoie la valeur true pour les appels API suivants.

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

J’ai même essayé d’append System.gc() juste avant d’appeler delete pour m’assurer que tous les stream sont fermés.

Je ne suis pas sûr que ce soit une information utile, mais j’ai même essayé d’utiliser la méthode FileUtils.forceDelete(file) Apache commons qui a également échoué.

Alors qu’est-ce que je manque ici?

Mettre à jour:

En utilisant Files.delete(Paths.get(file.getAbsolutePath())) j’ai reçu l’erreur suivante.

 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) 

Bienvenue dans 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. 

Généralement, lorsqu’un processus a un fichier ouvert sous Windows, le système d’exploitation verrouille le fichier de manière à ce que le fichier ne puisse pas être supprimé. Si c’est votre programme qui a le fichier ouvert pendant que vous essayez de le supprimer, fermez d’abord le fichier puis supprimez-le. Si c’est un autre programme qui a le fichier ouvert, alors vous devrez déterminer qui l’a ouvert et partir de là.

Lorsqu’un processus a un fichier ouvert sous Linux, il n’y a généralement rien qui vous empêche de le supprimer, c’est pourquoi vous voyez un comportement différent.

Utilisez Files.delete(filePath) au lieu de file.delete() car file.delete() a un problème concernant les permissions sur Windows.

Vous pouvez peut-être utiliser System.Runtime.exec () pour exécuter une commande terminal / ligne de commande pour supprimer un fichier spécifique. Cela peut être en quelque sorte dépendant de la plate-forme, mais la commande à entrer dans la fonction exec () peut différer entre les propriétés de l’ordinateur.

Vous pouvez vérifier ce thread pour déterminer le système d’exploitation actuel du programme Java en cours d’exécution.

Comment puis-je déterminer par programme le système d’exploitation en Java?

Dans Linux, votre ligne serait la suivante:

 System.Runtime.exec("rm ");