当我启动应用程序时,我创建了一个临时文件夹:
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
我尝试调试应用程序,并在执行删除操作之前验证上面的图像实际位于指定的文件夹中。
令人讨厌的是,它有时只会发生。我已确保不在任何其他应用程序中打开临时文件夹中的文件夹/文件。有什么想法/建议吗?
答案 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\\")