Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,无法在Windows上删除文件_Java_Windows_Deployment_Javafx_Auto Update - Fatal编程技术网

Java,无法在Windows上删除文件

Java,无法在Windows上删除文件,java,windows,deployment,javafx,auto-update,Java,Windows,Deployment,Javafx,Auto Update,我的应用程序有一个简单的更新程序。在代码中,我正在下载一个新版本,删除旧版本并将新版本重命名为旧版本 它在Linux上运行良好。但在Windows上不起作用。没有例外或其他情况。 p、 它是当前运行的应用程序 更新: 不起作用-这意味着在file.delete()和file.renameTo(…)之后,文件仍处于活动状态。 我使用sunjava7。(因为我使用JavaFX) p、 对不起我的英语 public void checkUpdate(){ new Thread(new Runn

我的应用程序有一个简单的更新程序。在代码中,我正在下载一个新版本,删除旧版本并将新版本重命名为旧版本

它在Linux上运行良好。但在Windows上不起作用。没有例外或其他情况。 p、 它是当前运行的应用程序

更新:

不起作用-这意味着在file.delete()和file.renameTo(…)之后,文件仍处于活动状态。 我使用sunjava7。(因为我使用JavaFX)

p、 对不起我的英语

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

windows锁定当前正在使用的文件。您不能删除它们。在windows上,无法删除应用程序当前正在使用的jar文件。

windows锁定当前正在使用的文件。您不能删除它们。在windows上,您无法删除应用程序当前正在使用的jar文件。

原因如下:

  • 您是否具有在windows中编辑文件的权限

  • 该文件是否正在使用中

  • 这条路对不对


  • 有几个原因:

  • 您是否具有在windows中编辑文件的权限

  • 该文件是否正在使用中

  • 这条路对不对


  • 由于您使用的是Java 7,请尝试
    Java.nio.file.Files.delete(file.toPath())
    ,如果删除失败,它将抛出异常。

    由于您使用的是Java 7,请尝试
    Java.nio.file.Files.delete(file.toPath())
    ,如果删除失败,它将抛出异常。

    我不知道您使用的是哪个版本的Java

    我知道当Java是sun属性时,他们发布的对象文件无法在windows平台上正确删除文件(很抱歉,我再也找不到引用)

    您可以做的技巧是直接测试平台。在linux上,只需使用经典文件对象

    在windows上启动命令系统,要求windows删除所需文件

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

    我不知道你使用的是哪个版本的Java

    我知道当Java是sun属性时,他们发布的对象文件无法在windows平台上正确删除文件(很抱歉,我再也找不到引用)

    您可以做的技巧是直接测试平台。在linux上,只需使用经典文件对象

    在windows上启动命令系统,要求windows删除所需文件

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

    我找到了这个问题的解决办法。在我的案例中出现删除问题是因为-:

    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之前,我们必须检查是否有任何对象(如FileInputStream、RandomAccessFile)在该文件上打开。如果是,那么我们必须先关闭该对象,然后再对该文件调用delete。

    我找到了解决此问题的方法。在我的案例中出现删除问题是因为-:

    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之前,我们必须检查是否有任何对象(如FileInputStream、RandomAccessFile)在该文件上打开。如果是,那么我们必须在对该文件调用delete之前关闭该对象。

    我只想发表一条评论。我了解到,如果您以管理员身份运行eclipse程序,就可以从eclipse中删除Java文件。也就是说,当您右键单击IDE图标(Eclipse或任何其他IDE)并选择以管理员身份运行时,Windows允许您删除该文件

    File f1=new File("temp.txt");
    RandomAccessFile raf=new RandomAccessFile(f1,"rw");
    raf.close();
    f1.delete();//Now the file will  get deleted
    
    我希望这有帮助。它帮助了我

    诚恳地


    费尔南多

    我只想说一句话。我了解到,如果您以管理员身份运行eclipse程序,就可以从eclipse中删除Java文件。也就是说,当您右键单击IDE图标(Eclipse或任何其他IDE)并选择以管理员身份运行时,Windows允许您删除该文件

    File f1=new File("temp.txt");
    RandomAccessFile raf=new RandomAccessFile(f1,"rw");
    raf.close();
    f1.delete();//Now the file will  get deleted
    
    我希望这有帮助。它帮助了我

    诚恳地


    Fernando

    您可能需要创建一个名为
    bootstrap.jar
    的jar之类的东西。我用外部文件测试了这段代码,但没有使用外部文件。我得到了同样的结果。您可能需要创建一个名为
    bootstrap.jar
    的jar或其他东西。我用外部文件测试了这段代码,但没有使用。我有同样的结果。如果你通过你的程序测试路径,它会找到文件吗?我怀疑你只是有一个路径问题。我做了很多检查来寻找答案。我确信,这个文件是存在的。file.canRead()和file.canWrite()-从应用程序开始返回TrueRead。显然是一个桌面应用程序。我建议使用它部署它。它提供了许多吸引人的功能,包括但不限于闪屏、桌面集成、文件关联、自动更新(包括延迟下载和对更新的编程控制),按平台、体系结构或Java版本对本机和其他资源下载进行分区,配置运行时环境(最低J2SE版本、运行时选项、RAM等),使用扩展轻松管理公共资源..”在这上面花了2天时间-在这里找到了我的解决方案:如果你通过你的程序测试路径,它会找到文件吗?我怀疑你只是有一个路径问题。我做了很多检查来寻找答案。我确信,这个文件是存在的。file.canRead()和file.canWrite()-从应用程序开始返回TrueRead。显然是一个桌面应用程序。我建议使用它部署它。它提供了许多吸引人的功能,包括但不限于闪屏、桌面集成、文件关联、自动更新(包括延迟下载和对更新的编程控制),按平台、体系结构或Java版本对本机和其他资源下载进行分区,配置运行时环境(最低J2SE版本、运行时选项、RAM等),使用扩展轻松管理公共资源……”持续了两天,我在这里找到了我的解决方案:我做了很多检查,专门寻找答案。我确信,这个文件是存在的。file.canRead()和file.canWrite()-返回trueI生成的