2016-11-20 49 views
6

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

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

+0

Güncellemeye başladım Ben var istisna ile soru. – dammina

+0

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

cevap

0

Kullanım Files.delete(filePath) yerine file.delete() pencerelerde izni ile ilgili bazı sorunu var.

+0

lütfen soru güncellemesine bakın. – dammina

+1

Bu durum için iki API arasında fark yoktur. – eckes

+0

Dosyanızın JVM'de açıldığını söylüyor. Lütfen dosyayı kapatmayı deneyin ve JVM tarafından açılan bir Dosya silinemedi. Umarım yardımcı olur. –

1

Windows'a hoş geldiniz. Bir süreç Windows açık bir dosya olduğunda

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. 

Tipik olarak, işletim sistemi dosya silinemez bir şekilde dosyayı kilitler. Dosyayı silmeye çalışırken açık olan programınızsa, önce dosyayı kapatın ve sonra silin. Dosya açık olan başka bir programsa, o zaman kimin açık olduğunu anlamaya ve oradan gitmelisin.

Bir işlemin Linux'ta bir dosya açıldığında, genellikle onu silmenizi engelleyen bir şey yoktur, bu nedenle farklı davranışlar görürsünüz.

0

Belirli bir dosyayı silmek için bir terminal/komut satırı komutunu çalıştırmak için System.Runtime.exec() yöntemini kullanabilirsiniz. Bu bir şekilde platforma bağlı olabilir, ancak exec() işlevine girilecek komut, os özellikleri arasında farklılık gösterebilir.

Çalışmakta olan java programının geçerli işletim sistemini belirlemek için bu konuyu kontrol edebilirsiniz. Linux kullanımında

How do I programmatically determine operating system in Java?

olarak olurdu satır aşağıdaki gibidir:

System.Runtime.exec("rm <path to file>");