[英]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.