Java,不能删除Windows上的文件

我有一个简单的更新程序为我的应用程序。 在代码中,我正在下载一个新版本,删除旧版本,并将新版本重命名为旧版本。

它在Linux上正常工作。 但在Windows上不起作用。 没有excepions或别的东西。 ps RemotePlayer.jar它是目前运行的应用程序。

更新:

不起作用 – 这意味着在file.delete()和file.renameTo(…)文件仍然存在之后。 我使用太阳Java 7(因为我使用JavaFX)。

ps对不起,我的英文。

public void checkUpdate(){ new Thread(new Runnable() { @Override public void run() { System.err.println("Start of checking for update."); StringBuilder url = new StringBuilder(); url.append(NetworkManager.SERVER_URL).append("/torock/getlastversionsize"); File curJarFile = null; File newJarFile = null; try { curJarFile = new File(new File(".").getCanonicalPath() + "/Player/RemotePlayer.jar"); newJarFile = new File(new File(".").getCanonicalPath() + "/Player/RemotePlayerTemp.jar"); if (newJarFile.exists()){ newJarFile.delete(); } } catch (IOException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. System.err.println("Cannot find curr Jar file"); return; } if (curJarFile.exists()){ setAccesToFile(curJarFile); try { String resp = NetworkManager.makeGetRequest(url.toString()); JSONObject jsresp = new JSONObject(resp); if (jsresp.getString("st").equals("ok")){ if (jsresp.getInt("size") != curJarFile.length()){ System.out.println("New version available, downloading started."); StringBuilder downloadURL = new StringBuilder(); downloadURL.append(NetworkManager.SERVER_URL).append("/torock/getlatestversion"); if (NetworkManager.downLoadFile(downloadURL.toString(), newJarFile)){ if (jsresp.getString("md5").equals(Tools.md5File(newJarFile))){ setAccesToFile(newJarFile); System.err.println("Deleting old version. File = " + curJarFile.getCanonicalPath()); boolean b = false; if (curJarFile.canWrite() && curJarFile.canRead()){ curJarFile.delete(); }else System.err.println("Cannot delete cur file, doesn't have permission"); System.err.println("Installing new version. new File = " + newJarFile.getCanonicalPath()); if (curJarFile.canWrite() && curJarFile.canRead()){ newJarFile.renameTo(curJarFile); b = true; }else System.err.println("Cannot rename new file, doesn't have permission"); System.err.println("last version has been installed. new File = " + newJarFile.getCanonicalPath()); if (b){ Platform.runLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(null, String.format("Внимание, %s", "Установлена новая версия, перезапустите приложение" + "", "Внимание", JOptionPane.ERROR_MESSAGE)); } }); } }else System.err.println("Downloading file failed, md5 doesn't match."); } } else System.err.println("You use latest version of application"); } }catch (Exception e){ e.printStackTrace(); System.err.println("Cannot check new version."); } }else { System.err.println("Current jar file not found"); } } }).start(); } private void setAccesToFile(File f){ f.setReadable(true, false); f.setExecutable(true, false); f.setWritable(true, false); } 

Windows锁定当前正在使用的文件。 你不能删除它们。 在Windows上,您不能删除您的应用程序当前正在使用的jar文件。

我找到了解决这个问题的办法。 删除问题发生在我的情况下,因为:

 File f1=new File("temp.txt"); RandomAccessFile raf=new RandomAccessFile(f1,"rw"); f1.delete();//The file will not get deleted because raf is open on the file to be deleted 

但是,如果我在调用delete之前关闭RandomAccessFile,那么我可以删除文件。

 File f1=new File("temp.txt"); RandomAccessFile raf=new RandomAccessFile(f1,"rw"); raf.close(); f1.delete();//Now the file will get deleted 

因此,在调用删除天气之前,我们必须检查FileInputStream,RandomAccessFile等任何对象是否在该文件上打开。 如果是,那么我们必须在调用对该文件的删除之前关闭该对象。

由于您使用的是Java 7,请尝试java.nio.file.Files.delete(file.toPath()) ,如果删除失败,它将引发异常。

有几个原因:

  1. 是否有权限在Windows中编辑文件。

  2. 该文件正在使用或没有。

  3. 路径是否正确。

我不知道你使用的是什么版本的Java。

我知道,当Java是太阳属性,他们发布的对象文件无法正确删除Windows平台上的文件(对不起,我没有找到参考没有更多)。

你可以做的技巧是直接测试平台。 当你在Linux上只使用经典的文件对象。

在Windows上启动一个命令系统,让Windows删除你想要的文件。

 Runtime.getRuntime().exec(String command); 

我只想做一个评论。 我了解到,如果以管理员身份运行eclipse程序,则可以从eclipse中删除Java中的文件。 也就是说,右键单击IDE图标(Eclipse或任何其他IDE)并选择以管理员身份运行时,Windows允许您删除该文件。

我希望这有帮助。 它帮助了我。

亲切,

费尔南多