【发布时间】:2014-08-12 00:29:30
【问题描述】:
我正在从我的 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()。还是不行。
【问题讨论】:
-
在你的代码中你永远不会删除目录...
-
问题是它甚至没有从文件夹中删除我的文件
-
首先添加 delete() 以防文件夹为空,更正问题中的代码,然后我们继续... :) 另外,检查 delete() 是否返回 'true'
-
您不需要在 response.getOutputStream 上使用文件 ZipOutputStream 作为 XSLT 结果。
-
更新了...还是什么都没有
标签: java tomcat servlets stream tomcat6