无法删除临时文件夹(有时)

时间:2011-07-12 11:03:46

标签: java io

当我启动应用程序时,我创建了一个临时文件夹:

  public static File createTempDir(String name) throws IOException {
    File tempDir = File.createTempFile(name, "");
    if (!(tempDir.delete())) {
      throw new IOException("could not delete" + tempDir.getAbsolutePath());
    }

    if (!(tempDir.mkdir())) {
      throw new IOException("could not create" + tempDir.getAbsolutePath());
    }
    tempDir.deleteOnExit();
    return tempDir;
  }

在会话期间,用户可能会加载文件。因此,将删除旧的临时目录,并根据加载的文件的ID创建新的。

在删除旧临时目录的加载过程中,我有时会得到:

java.io.IOException:无法删除文件:

以下是旧临时文件夹的删除方式:

  public void cleanup(String tmpPath) {
    File tmpFolder = new File(tmpPath);
    if (tmpFolder != null && tmpFolder.isDirectory()) {
      try {
        FileUtils.deleteDirectory(file);
      } catch (IOException e) {
            e.printStackTrace();
      }
    } 
  }

其中FileUtils是:org.apache.commons.io.FileUtils。通常,临时文件夹的内容为:

mytempfolder_uuid    | - > mysubfolder           | - > myImage.jpg

错误是:

java.io.IOException:无法删除文件:C:\ Users \ xxx \ AppData \ Local \ Temp \ mytempfolder_uuid \ mysubfolder \ myImage.jpg

我尝试调试应用程序,并在执行删除操作之前验证上面的图像实际位于指定的文件夹中。

令人讨厌的是,它有时只会发生。我已确保不在任何其他应用程序中打开临时文件夹中的文件夹/文件。有什么想法/建议吗?

4 个答案:

答案 0 :(得分:3)

您无法删除已打开的文件,也无法删除包含文件的目录。您必须确保目录中的所有文件都已关闭。

答案 1 :(得分:1)

我建议您使用Guava库。它有一个方法Files.createTempDir(),可以完全满足您的需求:

  

以原子方式在系统下方的某个位置创建一个新目录   临时目录(由java.io.tmpdir系统定义)   property),并返回其名称。使用此方法代替   当你想创建一个文件时,File.createTempFile(String,String)   目录,而不是常规文件。 一个常见的陷阱就是打电话   createTempFile,删除文件并在其位置创建目录,   但这导致了一种可以被利用来创造的竞争条件   安全漏洞,尤其是可执行文件时   写入目录。此方法假定为临时   卷是可写的,有自由的inode和free块,它会   不会被称为每秒数千次。

答案 2 :(得分:1)

尝试删除临时文件夹中的文件,然后再将其删除。尝试像

这样的东西
private boolean deleteFolder(File path) {
    if (path.exists()) {
        File[] files = path.listFiles();
        for (File f : files) {
            if (f.isDirectory()) {
                deleteFolder(f);
            } else {
                f.delete();
            }
        }
    }

    return path.delete();
}

也使用deleteOnExit不是一个好主意...

喝彩!

答案 3 :(得分:0)

public static boolean deleteDir(String path)
{
    java.io.File dir = new java.io.File(path);
    if (dir.isDirectory())
    {
        String[] filesList = dir.list();
        for(String s : filesList)
        {
            boolean success = new java.io.File(dir, s).delete();
            if(!success)
            {
                return false;
            }
        }
    }
    return dir.delete();
}

然后您就可以使用它:deleteDir("C:\\MyFolder\\subFolder\\")