我的应用程序有一个简单的更新程序。在代码中,我正在下载新版本,删除旧版本并将新版本重命名为旧版本。
它在Linux上运行良好。但是在Windows上不起作用。没有例外或其他东西。 附: RemotePlayer.jar它是当前运行的应用程序。
更新:
不起作用 - 这意味着在file.delete()和file.renameTo(...)文件仍然存活之后。 我使用sun java 7.(因为我使用JavaFX)。
P.S。抱歉我的英文。
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);
}
答案 0 :(得分:3)
windows锁定当前正在使用的文件。你无法删除它们。在Windows上,您无法删除应用程序当前正在使用的jar文件。
答案 1 :(得分:3)
我找到了解决这个问题的方法。在我的案例中发生了删除问题,因为 - :
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
因此我们必须在调用delete weather之前检查任何对象,例如FileInputStream,RandomAccessFile是否在该文件上打开。如果是,那么我们必须在调用该文件上的删除之前关闭该对象。
答案 2 :(得分:1)
由于您使用的是Java 7,请尝试java.nio.file.Files.delete(file.toPath())
,如果删除失败,它将抛出异常。
答案 3 :(得分:0)
有几个原因:
您是否有权在Windows中编辑文件。
该文件是否正在使用。
路径是否合适。
答案 4 :(得分:0)
我不知道您使用的Java版本。
我知道当Java是sun属性时,他们发布了Object File无法在windows plateform上正确删除文件(抱歉,我不再找到引用)。
你可以做的技巧是直接测试平台。当你在linux上时,只需使用经典的File对象。
在Windows上启动一个命令系统,要求Windows删除你想要的文件。
Runtime.getRuntime().exec(String command);
答案 5 :(得分:-1)
我只是想做一个评论。我了解到,如果以管理员身份运行eclipse程序,可以从eclipse中删除Java中的文件。即当您右键单击IDE图标(Eclipse或任何其他IDE)并选择以管理员身份运行时,Windows允许您删除该文件。
我希望这会有所帮助。它帮助了我。
亲切,
费尔南多