Vetalll
Vetalll

Reputation: 3692

Java, cannot delete file on Windows

I have a simple updater for my application. In code i am downloading a new version, deleting old version and renaming new version to old.

It works fine on Linux. But doesn't work on Windows. There are no excepions or something else. p.s. RemotePlayer.jar it is currently runned application.

UPDATED:

Doesn't work - it means that after file.delete() and file.renameTo(...) file still alive. I use sun java 7. (because I use JavaFX).

p.s. Sorry for my English.

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);
}

Upvotes: 1

Views: 27289

Answers (6)

Fernando
Fernando

Reputation: 9

I just want to make one comment. I learned that you can delete files in Java from eclipse if you run eclipse program as Administrator. I.e. when you right click on the IDE Icon (Eclipse or any other IDE) and select Run as Administrator, Windows lets you delete the file.

I hope this helps. It helped me.

Cordially,

Fernando

Upvotes: -3

Tushar Arora
Tushar Arora

Reputation: 113

I found the solution to this problem. The problem of deletion occurred in my case because-:

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

But if I close RandomAccessFile before calling delete then I am able to delete the file.

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

So we must check before calling delete weather any object such as FileInputStream, RandomAccessFile is open on that file or not. If yes then we must close that object before calling delete on that file.

Upvotes: 7

David Level
David Level

Reputation: 353

I don't know wich version of Java you are using.

I know when Java was sun property they publish that the Object File can't delete files correctly on windows plateform (sorry I don't find the reference no more).

The tricks you can do is to test the plateform directly. When you are on linux just use the classic File object.

On windows launch a command system to ask windows to delete the file you want.

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

Upvotes: 0

Healer
Healer

Reputation: 290

There are several reasons:

  1. Whether you have permissions to edit the file in windows.

  2. The file is in use or not.

  3. The path is right or not.

Upvotes: 0

irreputable
irreputable

Reputation: 45433

Since you are using Java 7, try java.nio.file.Files.delete(file.toPath()), it'll throw exception if deletion fails.

Upvotes: 1

jtahlborn
jtahlborn

Reputation: 53684

windows locks files that are currently in use. you cannot delete them. on windows, you cannot delete a jar file which your application is currently using.

Upvotes: 3

Related Questions