Java IO file.delete()
API'sini kullanarak Windows işletim sisteminde bir dosyayı silmeye çalışıyorum. Ancak başarısız ve yanlış döndürür. Aynı kod Ubuntu'da bir çekicilik gibi çalışır.Java kullanarak Windows'ta bir dosya silinemedi
Dosyanın izinlerinin, programın onu silmesine izin verdiğini doğruladım. Ayrıca, dosya için tüm girdi ve çıktı akışı, kaynaklarla denemeye açılmıştır. Ben test edilmiş ve dışarı bulduk bir hata ayıklayıcı kullanarak
try (InputStream in = new FileInputStream(localFile); OutputStream out = new FileOutputStream(destinationFileName))
ben API çağrıları aşağıdaki için true
döndüren dosyayı silmek kod satırında.
file.exists()
file.canRead();
file.canWrite();
file.canExecute();
Hatta şu bütün akarsular kapalı olduğundan emin olmak için silme çağırmadan önce
System.gc()
ekleyerek çalıştılar.
Bunun yardımcı bir bilgi olup olmadığından emin değiliz, ancak Apache commons FileUtils.forceDelete(file)
yöntemini kullanmayı denedim ve ayrıca başarısız oldu.
Burada neyi özlüyorum?
Güncelleme: Files.delete(Paths.get(file.getAbsolutePath()))
kullanarak
aşağıdaki hata var. file.delete()
olarak
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() oldukça eski apı'dir. 'Files.delete (somePath)' ı kullanmayı deneyebilirsiniz, bu yüzden daha iyi bir hata/istisna alabilirsiniz: bkz. Http://stackoverflow.com/questions/12139482/difference-between-filesdeletepath-and-filedelete – user140547
Güncellemeye başladım Ben var istisna ile soru. – dammina
Windows'da, herhangi birinin (kendi işleminiz dahil) bir dosya tanıtıcısı açık olan bir dosyayı silemezsiniz. Bu, Unix'ten her zaman silebileceğiniz (ve sonra açık dosya tanımlayıcılarını kullandıktan sonra) farklıdır. Yapabilecekleriniz (eğer silinmesi gereken geçici bir dosya ise), deleteOnExit'i kullanabilirsiniz, bu işleminiz açık dosya-kodlayıcılara sahip tek kişi olduğu sürece işe yarayabilir. – eckes