Java中的'file.delete()'未删除指定的文件

55

目前我用以下代码删除文件,但它不起作用。我以为可能是权限问题或其他原因,但事实并非如此。我正在测试的文件为空且存在,所以不确定为什么它不能被删除。

UserInput.prompt("Enter name of file to delete");
String name = UserInput.readString();
File file = new File("\\Files\\" + name + ".txt");
file.delete();
任何帮助都将不胜感激!
我现在有:
File file = new File(catName + ".txt");
String path = file.getCanonicalPath();
File filePath = new File(path);
filePath.delete();
为了在运行时尝试找到正确的路径,以便如果程序被转移到另一台计算机上,它仍然能够找到文件。

1
你检查了文件和文件夹的权限吗? - lock
1
使用哪个环境:Unix 还是 Windows? - rkg
1
有任何异常抛出吗?file.delete()调用的返回值是什么? - Brad Mace
“\Files\”是用来干什么的?你真的要添加“.txt”吗? - moinudin
1
还要记得关闭可能正在使用该文件的任何程序。我曾试图在数据库浏览器中打开一个数据库时删除它。 - Will Nasby
1
如果这是在Windows下,那么这是因为文件已经被打开(或者mmap'd)。Windows会锁定已经打开的文件,所以File::delete无法删除它们。 - Luke Hutchison
8个回答

83

问题也可能是由于您忘记关闭的任何输出流而引起的。在我的情况下,我在删除文件之前就已经使用文件了。但是,在文件操作的某个地方,我忘记关闭一个我用来写入稍后尝试删除的文件的输出流。


5
相同的概念,但我发现我必须关闭输入流。 - R.D. Alkire
在 FileInputStream/FileOutputStream 关闭后它仍然可以工作。非常感谢。 - deadend
这是我能想到的最后一步,但你是对的... 正确关闭文件(不仅仅是刷新)可以解决问题。 - Al-Punk

37

请务必确定您当前的工作目录,并相对于它编写文件路径。

以下代码:

File here = new File(".");
System.out.println(here.getAbsolutePath());

…将打印出该目录。

此外,与您的问题无关,请尝试使用File.separator保持操作系统独立性。反斜杠仅适用于Windows。


4
与普遍观点相反,正斜杠在Windows上确实可以使用。只是不要期望Windows返回带有正斜杠的路径。 - meustrus

12

我遇到了同样的问题!后来发现我的目录不是空的。我在另一个帖子中找到了解决方案:not able to delete the directory through Java

/**
 * Force deletion of directory
 * @param path
 * @return
 */
static public boolean deleteDirectory(File path) {
    if (path.exists()) {
        File[] files = path.listFiles();
        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory()) {
                deleteDirectory(files[i]);
            } else {
                files[i].delete();
            }
        }
    }
    return (path.delete());
}

8

尝试关闭之前在其他方法中打开的所有FileOutputStream/FileInputStream,然后再尝试删除,就可以像魔法一样奏效。


7

我猜测问题在于路径不正确。请尝试以下操作:

UserInput.prompt("Enter name of file to delete");
String name = UserInput.readString();
File file = new File("\\Files\\" + name + ".txt");
if (file.exists()) {
    file.delete();
} else {
    System.err.println(
        "I cannot find '" + file + "' ('" + file.getAbsolutePath() + "')");
}

6

如果你想删除文件,首先关闭所有的连接和流,然后再删除该文件。


3
在我的情况下,由于未处理的异常,close() 没有执行。
void method() throws Exception {
    FileInputStream fis = new FileInputStream(fileName);
    parse(fis);
    fis.close();
}

假设在parse()方法中抛出了异常,但是该方法没有处理该异常,因此文件没有被关闭。最终,该文件被删除,但删除操作失败了,文件没有被删除。
相反,如果我将代码修改为以下内容,则可以正常工作...
    try {
        parse(fis);
    }
    catch (Exception ex) {
        fis.close();
        throw ex;
    }

所以基础的Java,有时候我们会忽视。


在这种情况下,我建议将 fis.close() 也放在 finally 中。 - smilyface

2
如其他答案所示,在Windows上您无法删除已打开的文件。但是,另一件可能会阻止Windows中的文件被删除的事情是,如果它被映射到MappedByteBuffer(或DirectByteBuffer)中-如果是这样,则在字节缓冲区进行垃圾回收之前,文件将无法被删除。这里有一些相对安全的代码可以强制关闭(清理)DirectByteBuffer,以便在进行垃圾回收之前删除文件:https://github.com/classgraph/classgraph/blob/master/src/main/java/nonapi/io/github/classgraph/utils/FileUtils.java#L606 清理ByteBuffer后,您可以删除该文件。但是,请确保在清理后不再使用ByteBuffer,否则JVM将崩溃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接