java“file.delete()”没有删除指定的文件

e7arh2l6  于 2021-06-29  发布在  Java
关注(0)|答案(13)|浏览(417)

这是目前我必须删除的文件,但它不工作。我以为可能是权限问题什么的,但事实并非如此。我正在测试的文件是空的并且存在,所以不确定为什么不删除它。

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

在运行时尝试并找到正确的路径,以便在将程序传输到其他计算机时仍能找到该文件。

olqngx59

olqngx591#

如果要删除文件,请先关闭所有连接和流。然后删除文件。

arknldoa

arknldoa2#

在我的例子中,是close()由于未处理的异常而没有执行。

void method() throws Exception {
    FileInputStream fis = new FileInputStream(fileName);
    parse(fis);
    fis.close();
}

假设在parse()上抛出异常,此方法不处理异常,因此文件未关闭,接下来,文件将被删除,delete语句失败,请不要删除。
所以,相反,我有这样的代码,然后它的工作。。。

try {
        parse(fis);
    }
    catch (Exception ex) {
        fis.close();
        throw ex;
    }

所以基本的java,有时我们会忽略。

tct7dpnv

tct7dpnv3#

问题还可能是由于您忘记关闭的任何输出流造成的。在我的情况下,在删除文件之前,我正在处理该文件。然而,在文件操作中的一个地方,我忘记关闭一个输出流,我用来写入后来试图删除的文件。

wlsrxk51

wlsrxk514#

我错误地打开了一个bufferedreader,比如:

File f = new File("somefile.txt");
BufferedReader br = new BufferedReader(new FileReader(f));

…当然我不能执行 f.delete() 因为我 Package 了filereader,而不是示例化它自己的变量,在那里我可以显式地关闭它。嗯。。。
一旦我编码了:

File f = new File("somefile.txt");
FileReader fread = new FileReader(f);
BufferedReader br = new BufferedReader(fread);

我可以开一张支票 br.close(); br=null; fread.close(); fread=null; 以及 f.delete() 干得不错。

brvekthn

brvekthn5#

在我的例子中,我正在处理一个目录中包含的一组jar文件。在我处理它们之后,我试图从那个目录中删除它们,但它们不会删除。我使用jarfile来处理它们,问题是当我完成时忘记关闭jarfile。

vqlkdk9b

vqlkdk9b6#

我怀疑问题是路径不正确。试试这个:

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() + "')");
}
trnvg8h3

trnvg8h37#

尝试关闭所有 FileOutputStream/FileInputStream 你以前用其他方法打开过,然后尝试删除,效果很不错。

t5zmwmid

t5zmwmid8#

问题是,检查你是否关闭了所有的流或没有如果打开关闭流和删除,重命名..等文件这是为我工作

cxfofazt

cxfofazt9#

如果仍然无法工作,可以调用垃圾收集器关闭文件并释放内存

System.gc();
if(new File("./__tmp.txt").delete()){
    System.out.println("OK");
}

如果以前使用代码段打开过文件,请不要忘记关闭该文件 fio.close() 我用Java1.8测试过,效果不错。

ezykj2lf

ezykj2lf10#

一定要找出当前的工作目录,并编写与之相关的文件路径。
此代码:

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

... 会打印出那个目录。
另外,与你的问题无关,尽量使用 File.separator 保持操作系统的独立性。反斜杠只适用于窗口。

zd287kbt

zd287kbt11#

由于目录不是空的,file.delete()总是返回false。
我曾经
file.deleteRecursive()
它在kotlin中可用,将直接完全删除并返回布尔响应,就像file.delete()一样。

pgky5nke

pgky5nke12#

我也有同样的问题!然后意识到我的目录不是空的。我在另一个线程中找到了解决方案:不能通过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());
}
2j4z5cfb

2j4z5cfb13#

如其他答案所示,在windows上不能删除打开的文件。但是,另一个可以阻止文件在windows上被删除的方法是,如果它被Map到 MappedByteBuffer (或 DirectByteBuffer )--如果是,则在字节缓冲区被垃圾回收之前,无法删除该文件。有一些相对安全的代码来强制关闭(清洗)a DirectByteBuffer 在这里收集垃圾之前:https://github.com/classgraph/classgraph/blob/master/src/main/java/nonapi/io/github/classgraph/utils/fileutils.java#l606 清洁后 ByteBuffer ,您可以删除该文件。但是,一定不要使用 ByteBuffer 在清理完它之后,jvm将再次崩溃。

相关问题