我有一个简单的更新程序为我的应用程序。 在代码中,我正在下载一个新版本,删除旧版本,并将新版本重命名为旧版本。
它在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())
,如果删除失败,它将引发异常。
有几个原因:
是否有权限在Windows中编辑文件。
该文件正在使用或没有。
路径是否正确。
我不知道你使用的是什么版本的Java。
我知道,当Java是太阳属性,他们发布的对象文件无法正确删除Windows平台上的文件(对不起,我没有找到参考没有更多)。
你可以做的技巧是直接测试平台。 当你在Linux上只使用经典的文件对象。
在Windows上启动一个命令系统,让Windows删除你想要的文件。
Runtime.getRuntime().exec(String command);
我只想做一个评论。 我了解到,如果以管理员身份运行eclipse程序,则可以从eclipse中删除Java中的文件。 也就是说,右键单击IDE图标(Eclipse或任何其他IDE)并选择以管理员身份运行时,Windows允许您删除该文件。
我希望这有帮助。 它帮助了我。
亲切,
费尔南多