繁体   English   中英

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

[英]Cannot delete temp folder (sometimes)

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

  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;
  }

在 session 期间,用户可能会加载文件。 结果,旧的临时目录被删除,并根据加载的文件的 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\Tempfolder\mytempfolder.jpg_

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

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

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

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

在系统临时目录(由 java.io.tmpdir 系统属性定义)下自动创建一个新目录,并返回其名称。 当您希望创建目录而不是常规文件时,请使用此方法而不是 File.createTempFile(String, String)。 一个常见的陷阱是调用 createTempFile,删除文件并在其位置创建一个目录,但这会导致竞争条件,可被利用来创建安全漏洞,尤其是在将可执行文件写入目录时。 此方法假定临时卷是可写的,具有空闲 inode 和空闲块,并且每秒不会被调用数千次。

在删除之前尝试删除临时文件夹中的文件。 尝试类似的东西

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 不是一个好主意......

干杯!

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\\")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM