File.delete() 拒绝工作时如何删除文件?
How can I delete a file when File.delete() refuses to work?
我知道有很多话题涉及这个主题,但到目前为止我发现的所有内容都未能完成工作,所以我想我一定是遗漏了什么。
我有一段代码应该允许用户从列表中select一个名字。这些名称是从名为 users.ldf 的加密文件(一种仅由我的软件使用的加密文件格式)加载的。一旦用户选择了一个名字,他们就会按下一个按钮来触发这部分代码。代码 应该 遍历文件,将除 selected 之外的每一行复制到新文件,删除旧文件,然后将新文件重命名为与被删除的旧文件同名,从而从列表中删除该名称。但是,旧文件永远不会被删除,新文件也永远不会重命名。这是代码:
private void delUserBtnActionPerformed(java.awt.event.ActionEvent evt) {
String user = lm.getElementAt(userList.getSelectedIndex()).toString();
try {
Encryption e = new Encryption();
File oldfile = new File("libs/users.ldf");
File newfile = new File("libs/temp.ldf");
PrintWriter writer = new PrintWriter(new FileWriter(newfile, false));
Scanner scanner = new Scanner(oldfile);
while (scanner.hasNextLine()) {
String lineFromFile = scanner.nextLine();
String line = e.decrypt(lineFromFile);
if (!line.contains(user)) {
writer.write(e.encrypt(line));
System.out.println("Keeping user " + line);
} else {
System.out.println("Erasing user " + line);
}
}
try {
writer.flush();
writer.close();
scanner.close();
System.gc();
} catch (Exception exc) {
exc.printStackTrace();
}
oldfile.delete();
newfile.renameTo(new File("libs/users.ldf"));
lm.clear();
JOptionPane.showMessageDialog(null, "User " + user + " removed!");
} catch (FileNotFoundException ex) {
Logger.getLogger(EditUsers.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(EditUsers.class.getName()).log(Level.SEVERE, null, ex);
}
}
我试过:
删除前设置 oldfile.setWritable(true)。
使用 BufferedWriter 而不是 PrintWriter 和 FileOutputStream。
运行 垃圾收集器。
程序中任何位置的文件的所有其他实例都将关闭并刷新。
我试过将刷新和关闭部分放在 finally
块中,但即使我写...
finally {
try {
//Flush, close, System.gc etc....
} catch (IOException exc) {
}
NetBeans 突出显示错误并显示 finally without try
。
None 其中有效。即使添加了 try/catch,也不会抛出异常,并且代码会像正常工作一样执行,但文件保持不变。
我应该提一下,我也 运行 代码:
ProcessBuilder pb = new ProcessBuilder("del", oldfile");
Process p = pb.start();
p.waitFor();
导致异常 "Could not find the specified file"。我检查并仔细检查了文件路径,文件已经准备好,所以位置符合预期。
有关信息,class 加密只是接收一个字符串,对其进行加密,然后 returns 加密字符串,因此其中不包含文件实例。
我可以使用任何其他方法来擦除此文件吗?
我是运行Win10、NetBeans 8.0.2和JDK的最新版本。
非常感谢,
G
好吧,我能想到的最好的办法就是有点难看,而且还远非完美。
我现在也在写一个批处理文件,它删除和重命名相关文件,并用 ProcessBuilder
执行它。它可以工作,除非存在文件权限问题。
我知道有很多话题涉及这个主题,但到目前为止我发现的所有内容都未能完成工作,所以我想我一定是遗漏了什么。
我有一段代码应该允许用户从列表中select一个名字。这些名称是从名为 users.ldf 的加密文件(一种仅由我的软件使用的加密文件格式)加载的。一旦用户选择了一个名字,他们就会按下一个按钮来触发这部分代码。代码 应该 遍历文件,将除 selected 之外的每一行复制到新文件,删除旧文件,然后将新文件重命名为与被删除的旧文件同名,从而从列表中删除该名称。但是,旧文件永远不会被删除,新文件也永远不会重命名。这是代码:
private void delUserBtnActionPerformed(java.awt.event.ActionEvent evt) {
String user = lm.getElementAt(userList.getSelectedIndex()).toString();
try {
Encryption e = new Encryption();
File oldfile = new File("libs/users.ldf");
File newfile = new File("libs/temp.ldf");
PrintWriter writer = new PrintWriter(new FileWriter(newfile, false));
Scanner scanner = new Scanner(oldfile);
while (scanner.hasNextLine()) {
String lineFromFile = scanner.nextLine();
String line = e.decrypt(lineFromFile);
if (!line.contains(user)) {
writer.write(e.encrypt(line));
System.out.println("Keeping user " + line);
} else {
System.out.println("Erasing user " + line);
}
}
try {
writer.flush();
writer.close();
scanner.close();
System.gc();
} catch (Exception exc) {
exc.printStackTrace();
}
oldfile.delete();
newfile.renameTo(new File("libs/users.ldf"));
lm.clear();
JOptionPane.showMessageDialog(null, "User " + user + " removed!");
} catch (FileNotFoundException ex) {
Logger.getLogger(EditUsers.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(EditUsers.class.getName()).log(Level.SEVERE, null, ex);
}
}
我试过:
删除前设置 oldfile.setWritable(true)。
使用 BufferedWriter 而不是 PrintWriter 和 FileOutputStream。
运行 垃圾收集器。
程序中任何位置的文件的所有其他实例都将关闭并刷新。
我试过将刷新和关闭部分放在 finally
块中,但即使我写...
finally {
try {
//Flush, close, System.gc etc....
} catch (IOException exc) {
}
NetBeans 突出显示错误并显示 finally without try
。
None 其中有效。即使添加了 try/catch,也不会抛出异常,并且代码会像正常工作一样执行,但文件保持不变。
我应该提一下,我也 运行 代码:
ProcessBuilder pb = new ProcessBuilder("del", oldfile");
Process p = pb.start();
p.waitFor();
导致异常 "Could not find the specified file"。我检查并仔细检查了文件路径,文件已经准备好,所以位置符合预期。 有关信息,class 加密只是接收一个字符串,对其进行加密,然后 returns 加密字符串,因此其中不包含文件实例。
我可以使用任何其他方法来擦除此文件吗?
我是运行Win10、NetBeans 8.0.2和JDK的最新版本。 非常感谢,
G
好吧,我能想到的最好的办法就是有点难看,而且还远非完美。
我现在也在写一个批处理文件,它删除和重命名相关文件,并用 ProcessBuilder
执行它。它可以工作,除非存在文件权限问题。