gpt4 book ai didi

Java,无法在Windows上删除文件

转载 作者:可可西里 更新时间:2023-11-01 11:08:45 26 4
gpt4 key购买 nike

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

它在 Linux 上运行良好。但在 Windows 上不起作用。没有异常(exception)或其他情况。附: RemotePlayer.jar 是当前运行的应用程序。

更新:

不起作用 - 这意味着在 file.delete() 和 file.renameTo(...) 之后文件仍然存在。我使用 sun java 7。(因为我使用 JavaFX)。

附注对不起我的英语。

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

最佳答案

我找到了这个问题的解决方案。删除问题发生在我的案例中,因为-:

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

关于Java,无法在Windows上删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13685592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com