Java, impossible de supprimer le fichier sous Windows


J'ai un programme de mise à jour simple pour mon application. Dans le code, je télécharge une nouvelle version, supprime l'ancienne version et renomme la nouvelle version en ancienne.

Cela fonctionne très bien sur Linux. Mais ne fonctionne pas sur Windows. Il n'y a pas excepions ou quelque chose d'autre. p.s. RemotePlayer.jar il est actuellement exécuté application.

MISE À JOUR:

Ne fonctionne pas - cela signifie qu'après le fichier.supprimer() et file.renameTo(... fichier encore en vie. J'utilise sun java 7. (parce que j'utilise JavaFX).

P. s. Désolé pour mon anglais.

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);
}
Author: Andrew Thompson, 2012-12-03

6 answers

Windows verrouille les fichiers actuellement utilisés. vous ne pouvez pas les supprimer. sous Windows, vous ne pouvez pas supprimer un fichier jar que votre application utilise actuellement.

 3
Author: jtahlborn, 2012-12-03 14:48:52

J'ai trouvé la solution à ce problème. Le problème de suppression s'est produit dans mon cas parce que -:

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

Mais si je ferme RandomAccessFile avant d'appeler delete, je peux supprimer le fichier.

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

Nous devons donc vérifier avant d'appeler delete weather tout objet tel que FileInputStream, RandomAccessFile est ouvert sur ce fichier ou non. Si oui, nous devons fermer cet objet avant d'appeler delete sur ce fichier.

 3
Author: Tushar Arora, 2014-02-13 14:29:29

Puisque vous utilisez Java 7, essayez java.nio.file.Files.delete(file.toPath()), il lèvera une exception si la suppression échoue.

 1
Author: irreputable, 2012-12-03 15:06:11

Il y a plusieurs raisons:

  1. Si vous disposez des autorisations pour modifier le fichier dans windows.

  2. Le fichier est utilisé ou non.

  3. Le chemin est droit ou non.

 0
Author: Healer, 2012-12-03 15:07:14

Je ne sais pas quelle version de Java vous utilisez.

Je sais que lorsque Java était la propriété sun, ils publient que le fichier objet ne peut pas supprimer correctement les fichiers sur la plateforme Windows (désolé, je ne trouve plus la référence).

Les astuces que vous pouvez faire sont de tester directement la plateforme. Lorsque vous êtes sous linux, utilisez simplement l'objet Fichier classique.

Sous Windows, lancez un système de commandes pour demander à Windows de supprimer le fichier que vous souhaitez.

Runtime.getRuntime().exec(String command);
 0
Author: David Level, 2013-07-16 14:04:47

Je veux juste faire un commentaire. J'ai appris que vous pouvez supprimer des fichiers en Java d'eclipse si vous exécutez le programme eclipse en tant qu'administrateur. C'est-à-dire lorsque vous faites un clic droit sur l'icône ID (Eclipse ou tout autreE) et sélectionnez Exécuter en tant qu'administrateur, Windows vous permet de supprimer le fichier.

J'espère que cela aide. Il m'a aidé.

Cordialement,

Fernando

 0
Author: Fernando, 2014-11-23 05:30:54