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 执行它。它可以工作,除非存在文件权限问题。