Java,无法在Windows上删除文件
我的应用程序有一个简单的更新程序。在代码中,我正在下载一个新版本,删除旧版本并将新版本重命名为旧版本 它在Linux上运行良好。但在Windows上不起作用。没有例外或其他情况。 p、 它是当前运行的应用程序 更新: 不起作用-这意味着在file.delete()和file.renameTo(…)之后,文件仍处于活动状态。 我使用sunjava7。(因为我使用JavaFX) p、 对不起我的英语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
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文件。原因如下:
有几个原因:
由于您使用的是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生成的