Apache commons-io FileUtils.deleteDirectory无法正常工作

时间:2013-07-24 08:43:58

标签: java io apache-commons-io

我遇到了commons-io FileUtils.deleteDirectory(File)的问题。我只是打电话给

FileUtils.deleteDirectory(new File("/tmp/dir"));

目录结构是:

tmp/
 - dir/
    - a/
       - b/
          - c.txt

我尝试使用以下结果进行调试:

  1. 在删除c.txt之前,我在FileUtils中停止了程序。 if (!file.delete())
  2. 文件存在,我可以重命名(我当时没有锁定)。
  3. file.delete()返回true,程序以正常方式继续(文件仍然存在,但现在我无法重命名)
  4. 我删除b /目录之前停止程序。 if (!directory.delete())
  5. c.txt仍然存在于此目录中,并且目录中的delete()返回false并且“无法删除目录/ tmp / dir / a / b /”异常被抛出
  6. 当程序结束时,文件被删除,但是b /,a /,dir /目录不是。
  7. 我的奇怪行为是删除后存在c.txt文件并在其父目录上调用delete导致错误。该文件仅由Java程序使用。有什么建议?知道如果某些FileHandler仍然为文件打开,如何检查Java?

    更新:已修复

    我是愚蠢的混蛋,我再次检查了我的代码,我发现我错过了之前读过该文件的关闭流。我有一个读取输入的代码:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    InputStream is = new FileInputStream(new File("/tmp/dir/a/b/c.txt"));
    IOUtils.copy(is, baos); 
    String content = new String(baos.toByteArray());
    

    我改为(现在有效):

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    InputStream is = new FileInputStream(new File("/tmp/dir/a/b/c.txt"));
    IOUtils.copy(is, baos);
    // Close streams!
    baos.flush();
    baos.close();
    is.close(); // This is the most important!
    String content = new String(baos.toByteArray());
    

    这只是一个例子,我知道正确关闭所有流(使用try-finally)非常重要。 BufferedInputStream在这里也很有用。

0 个答案:

没有答案