当File.delete()拒绝工作时,如何删除文件?

时间:2015-08-04 08:50:18

标签: java file-io windows-10 netbeans-8

我意识到有很多线索涉及这个话题,但到目前为止我发现的所有内容都未能完成工作,所以我认为我必须遗漏一些东西。

我有一段代码,允许用户从列表中选择一个名称。这些名称是从名为users.ldf的加密文件加载的(加密文件格式仅由我的软件使用)。一旦用户选择了一个名字,他们就会按下一个按钮,触发这部分代码。代码应该遍历文件,将每行复制到新文件,除了选择的文件,删除旧文件,然后将新文件重命名为旧文件的同名删除,从而从列表中删除名称。但是,永远不会删除旧文件,并且永远不会重命名新文件。这是代码:

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。 运行垃圾收集器。 程序中任何位置的文件的所有其他实例都将被关闭并刷新。 我已经尝试将flush和close部分放在finally块中,但即使我写了......

finally {
    try {
    //Flush, close, System.gc etc....
    } catch (IOException exc) {
}

NetBeans突出显示错误,并说finally without try

这些都没有奏效。即使添加了try / catch,也没有抛出异常,并且代码执行就像它已正常工作一样,但文件保持不变。

我应该提一下,我还用以下代码运行代码:

ProcessBuilder pb = new ProcessBuilder("del", oldfile");
Process p = pb.start();
p.waitFor();

导致异常“无法找到指定的文件”。我检查并仔细检查了文件路径,文件已经准备好,所以位置是预期的。 有关信息,Encryption类只接收一个字符串,对其进行加密并返回加密的字符串,因此不包含该文件的实例。

我可以使用其他方法来删除此文件吗?

我正在运行Win10,NetBeans 8.0.2和最新版本的JDK。 非常感谢,

1 个答案:

答案 0 :(得分:0)

好的,所以我能想到的最好的是一个难看的修复,并且远非完美。

我现在还在编写一个批处理文件,删除并重命名相关文件,并使用ProcessBuilder执行该文件。它有效,除非存在文件权限问题。