Java, cannot delete file on Windows

23,750

Solution 1

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.

Solution 2

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.

Solution 3

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

Share:
23,750
Vetalll
Author by

Vetalll

Android developer.

Updated on November 07, 2020

Comments

  • Vetalll
    Vetalll over 3 years

    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);
    }
    
    • Max
      Max over 11 years
      If you test the path through your program will it find the file? I suspect you just have a pathing issue.
    • Vetalll
      Vetalll over 11 years
      I made a many checkings special for finding answers. And i sure - File exists. file.canRead() and file.canWrite() - returns true
    • Andrew Thompson
      Andrew Thompson over 11 years
      Since your app. is apparently a desktop app., I suggest deploying it using Java Web Start which "..provides many appealing features including, but not limited to, splash screens, desktop integration, file associations, automatic update (including lazy downloads and programmatic control of updates), partitioning of natives & other resource downloads by platform, architecture or Java version, configuration of run-time environment (minimum J2SE version, run-time options, RAM etc.), easy management of common resources using extensions.."
    • Jeff Levine
      Jeff Levine almost 6 years
      Pounded on this for 2 days - found my solution here: stackoverflow.com/questions/991489/…
  • durron597
    durron597 over 11 years
    You might need to create a jar called bootstrap.jar or something.
  • Vetalll
    Vetalll over 11 years
    I tested this code with external file, which are not using. And I have same result.
  • Vetalll
    Vetalll over 11 years
    I made a many checkings special for finding answers. And i sure - File exists. file.canRead() and file.canWrite() - returns true
  • Emerald Cottet
    Emerald Cottet about 3 years
    It works also with FileOutputStream and FileInputStream to close them before delete . Thanks !