1

アプリケーション用のシンプルなアップデータがあります。コードでは、新しいバージョンをダウンロードし、古いバージョンを削除して、新しいバージョンの名前を古いものに変更しています。

Linuxでは問題なく動作します。ただし、Windows では動作しません。例外などはありません。ps RemotePlayer.jar 現在実行中のアプリケーションです。

更新しました:

動作しません - file.delete() および file.renameTo(...) の後、ファイルがまだ生きていることを意味します。私はSun 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);
}
4

6 に答える 6

3

Windows は、現在使用中のファイルをロックします。それらを削除することはできません。Windows では、アプリケーションが現在使用している jar ファイルを削除できません。

于 2012-12-03T14:48:52.837 に答える
1

Java 7 を使用しているため、試しjava.nio.file.Files.delete(file.toPath())てみると、削除に失敗すると例外がスローされます。

于 2012-12-03T15:06:11.827 に答える
0

いくつかの理由があります:

  1. Windowsでファイルを編集する権限があるかどうか。

  2. ファイルが使用中かどうか。

  3. 道は正しいかどうか。

于 2012-12-03T15:00:28.980 に答える
0

使用している Java のバージョンがわかりません。

Javaが太陽の財産だったとき、彼らはオブジェクトファイルがWindowsプラットフォームでファイルを正しく削除できないことを知っています(申し訳ありませんが、参照が見つかりません)。

できるトリックは、プラットフォームを直接テストすることです。Linux を使用している場合は、従来の File オブジェクトを使用してください。

Windowsでコマンドシステムを起動して、必要なファイルを削除するようにWindowsに依頼します。

Runtime.getRuntime().exec(String command);
于 2013-07-16T14:04:47.747 に答える