为什么只删除了部分文件和文件夹?

时间:2014-06-21 11:05:34

标签: java tomcat servlets stream tomcat6

我从我的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()。仍然没有工作。

5 个答案:

答案 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类源?

  • 必须关闭zip文件中的每个条目。
  • 为zip编写过程打开的每个文件输入流都应该是 闭合。

检查以下示例: 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命令。希望这有帮助