强制删除文件夹中的所有文件

17

我一直在使用一段特定的代码来删除文件夹中的文件,但是由于可能我忘记关闭了一个或两个InputStream而导致问题很严重。我的代码非常庞大,我无法找出我没有关闭的所有Inputstreams。是否有一种方法可以在存在打开的InputStream的情况下删除文件?

这是我一直在使用的代码片段:

File fin = new File("C:/ABC Statements final/");
    File[] finlist = fin.listFiles();       
    for (int n = 0; n < finlist.length; n++) {
        if (finlist[n].isFile()) {
        System.gc();
        Thread.sleep(2000);
            finlist[n].delete();
        }
    }        

我已经编辑了代码,这个版本可以运行。


1
我建议的简短回答是否定的。你应该更好地处理你的流。 - MadProgrammer
那么我应该说,我已经浏览了代码中的每个输入流,并关闭了它们所有,但我仍然得到了相同的错误。 - Stanley Mungai
有两个想法。某人在某处正在打开文件和/或存在权限问题。 - MadProgrammer
7个回答

28

提供的代码块中没有InputStream实例。

为了避免编写大量未经测试的IO代码,请查看apache.commons.io项目,特别是FileDeleteStrategy类,用于文件删除操作。

你的代码可能会像这样:

File fin = new File("C:/ABC Statements final/");

for (File file : fin.listFiles()) {
    FileDeleteStrategy.FORCE.delete(file);
}   

主线程中的异常:"main" java.io.IOException: 无法删除文件:C:\ABC Statements final\Statement0.RPT 在org.apache.commons.io.FileUtils.forceDelete(FileUtils.java:1390)处 在org.apache.commons.io.FileDeleteStrategy$ForceFileDeleteStrategy.doDelete(FileDeleteStrategy.java:151)处 在org.apache.commons.io.FileDeleteStrategy.delete(FileDeleteStrategy.java:94)处 在abcbankestatement.ABCBankEStatement.main(ABCBankEStatement.java:502)处 Java结果:1 - Stanley Mungai
如果您将“delete”方法替换为“deleteQuietly”方法,则在此情况下,如果无法删除文件,则不会抛出异常 - Dmytro Chyzhykov
8
我不想删除异常,我需要删除这些文件。 - Stanley Mungai
1
请阅读此线程 - https://dev59.com/83NA5IYBdhLWcg3wWsiK - Dmytro Chyzhykov
其实,那是Windows系统,宝贝! - Dmytro Chyzhykov
4
实际上,根据您分享的链接,我找到了解决我的问题的答案。 我已经添加了System.gc()Thread.sleep,文件正在被删除。 谢谢你。 - Stanley Mungai

5
您可以使用:

FileUtils.deleteDirectory(File directory)

from Apache Commons


4
最好使用 cleanDirectory(),因为它说不会删除目录本身。但是,我不太确定 "clean" 是什么意思。 我猜测它的意思是删除目录中的内容,但文档非常糟糕,所以我不能确定。 - Timmmm

3
使用Apache Commons IO:
File dir = ...
FileUtils.deleteQuietly(dir);
dir.mkdirs();

不需要用这种方式检查异常。

3

使用:

   import org.apache.commons.io.FileUtils;
   FileUtils.cleanDirectory(fin);

文档:

 /**
     * Clean a directory without deleting it.
     *
     * @param directory directory to clean
     * @throws IOException in case cleaning is unsuccessful
     */

为了使用它,您需要一个依赖项:
Maven:
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

Gradle:

compile 'commons-io:commons-io:2.6'

有时候库可以救命。Java是非常好的语言,但不幸的是它有时会让事情变得困难。 - kodmanyagha

1
public void removeDir()
{
try
{
    File dir = new File((System.getProperty("user.dir")+"/ReportFolderToMail"+timeStamp));
    if (dir.isDirectory())
    {
        File[] files = dir.listFiles();
        if (files != null && files.length > 0)
        {
            for (File aFile : files) 
            {
                System.gc();
                Thread.sleep(2000);
                 FileDeleteStrategy.FORCE.delete(aFile);
                System.out.println("delet file" +aFile);
            }
        }
        dir.delete();
        System.out.println("delet" +dir);
    } 
    else 
    {
        dir.delete();
    }
}
catch(Exception e)
{
    e.printStackTrace();
}

2
请添加一些文档/说明。 - Ronnie Oosting

0
public boolean removeDir()
{
try
{
   //destFile = new File((System.getProperty("user.dir")+"/FileName"))
   // checks if the directory has any file
    File dir = destFile; 
    if (dir.isDirectory())
    {
        File[] files = dir.listFiles();
        if (files != null && files.length > 0)
        {
            for (File aFile : files) 
            {
                System.gc();
                Thread.sleep(2000);
                FileDeleteStrategy.FORCE.delete(aFile);
                System.out.println("delet file" +aFile);
            }
        }
        dir.delete();
        System.out.println("delet" +dir);
    } 
    else 
    {
        dir.delete();
    }
}
catch(Exception e)
{
    logger.log(LogStatus.FATAL, "Exception Occured While Deleting Folder : " +e);
}
return true;
}

0

我只是这样做,结果非常棒:

            System.gc();
            //then
            Files.delete(chosenFile.toPath());
            FileDeleteStrategy.FORCE.delete(chosenFile);

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