我从我的servlet(output.txt
)和XSL文件(文件夹generatedApps
及其内容)生成一些文件,然后将XSL转换生成的文件和文件夹打包成ZIP存档。客户端下载ZIP存档后,我想删除它,以及其他文件和文件夹。
这是我的代码:
InputStream inputStream = new ByteArrayInputStream(request.getParameter("content")
.getBytes("UTF-8"));
try {
TransformerFactory tFactory = new net.sf.saxon.TransformerFactoryImpl();
Transformer transformer = tFactory.newTransformer(new StreamSource(
getServletContext().getResourceAsStream("lib/GenerateGeddyJsCode.xsl")));
FileOutputStream fos = new FileOutputStream("output.txt");
transformer.transform(new StreamSource(inputStream), new StreamResult(fos));
String appName = new Scanner(new File("output.txt")).useDelimiter("\\Z").next();
ZipUsingJavaUtil zipper = new ZipUsingJavaUtil();
zipper.zipFiles("generatedApps/" + appName, "generatedApps/" + appName + "Archive.zip");
String path = "generatedApps/";
String fileName = appName + "Archive.zip";
File f = new File(path + fileName);
response.setContentType("application/zip");
response.setContentLength((int)f.length());
response.addHeader("Content-Disposition","attachment;filename=\"" + fileName + "\"");
byte[] arBytes = new byte[32768];
FileInputStream is = new FileInputStream(f);
ServletOutputStream op = response.getOutputStream();
int count;
while ((count = is.read(arBytes)) > 0)
{
op.write(arBytes, 0, count);
}
op.flush();
op.close();
is.close();
fos.close();
inputStream.close();
File toBeDel = new File("generatedApps/");
GenerateGeddyJsCode.removeDirectory(toBeDel);
File output = new File("output.txt");
output.delete();
方法removeDirectory
如下:
public static void removeDirectory(File dir) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
for (File aFile : files) {
removeDirectory(aFile);
}
}
} else {
dir.delete();
}
}
问题是最终只删除了ZIP存档(顺便说一下,存档位于generatedApps
内)。我试图关闭所有流,因为我已经读过没有封闭的流阻止删除。
如何删除剩余的文件和文件夹?
====================================编辑======= =================================
我更新的删除方法:
public static void removeDirectory(File dir) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
for (File aFile : files) {
removeDirectory(aFile);
}
} else if (files.length == 0) {
dir.delete();
}
}
dir.delete();
}
仍然无法正常工作。
====================================编辑2 ====== ================================== 添加了:
InputStream inStream = getServletContext().getResourceAsStream("lib/GenerateGeddyJsCode.xsl");
StreamSource inStreamSource = new StreamSource(inStream);
Transformer transformer = tFactory.newTransformer(inStreamSource);
以后inStream.close()
。仍然没有工作。
答案 0 :(得分:1)
您永远不会删除removeDirectory方法中的目录。
您需要删除else以使其无条件执行(对于目录以及非目录)。
public static void removeDirectory(File dir) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
for (File aFile : files) {
removeDirectory(aFile);
}
}
}// else {
dir.delete();
// }
}
答案 1 :(得分:1)
我想在评论中发帖,但我没有足够的声誉。我试过你的方法来删除文件,但没关系,但如果你可以删除" output.txt"文件应该是因为有一个对象使用该文件似乎你关闭所有的流,但检查我看到你使用Scanner对象获取appName的代码可能这可能是问题,因为Scanner对象指向你的& #34; output.txt的"文件。
改变这个:
String appName = new Scanner(new File("output.txt")).useDelimiter("\\Z").next();
这样的事情:
Scanner scanObject = new Scanner(new File("output.txt"));
String appName = scanObject.useDelimiter("\\Z").next();
scanObject.close();
我不确定新的Scanner(新文件(" output.txt"));我认为scanObject.close()也应关闭您传递给Scanner对象的File对象,如果没有,请尝试将其分开并在使用扫描仪后关闭File对象。
答案 2 :(得分:1)
您可以检查Zip实用程序是否正确关闭文件... 您是否可以访问ZipUsingJavaUtil类源?
检查以下示例: http://www.journaldev.com/957/java-zip-example-to-zip-single-file-and-a-directory-recursively
答案 3 :(得分:0)
1)重新格式化代码......看不到任何内容
2)在finally块中关闭你的溪流
try { ... } catch (Exception e) { ... handle your exception } finally { close what you have to close! }
3)“我试图关闭所有流,因为我已经读过没有封闭的流阻止删除。” 好吧,我猜你还有打开文件句柄。即使是外部文件句柄也可以防止删除。是否有任何防病毒程序扫描文件?在互联网上搜索检测打开文件句柄的工具。
4)您还可以测试aFile.deleteOnExit()是否有效。 “deleteOnExit”尝试在JVM关闭时删除该文件。
祝你好运答案 4 :(得分:0)
如果您使用Linux,则可以执行删除文件的命令行版本。
Runtime.getRuntime().exec("rm -rf");
' R' flag表示递归,意味着只从base开始,此命令将删除目录和所有子目录。
' F'旗帜强迫它,不会问你"你想删除xxxx.txt吗?"对于每个文件。
您也可以执行类似
的操作Runtime.getRuntime().exec("rm -rf *.java");
如果您只是删除Java文件。另外,windows和mac有一个shell delete file / delete directory命令。希望这有帮助