为什么只有一些文件和文件夹没有被删除



我正在从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()

您可以检查Zip实用程序是否正确关闭文件…您可以访问ZipUsingJavaUtil类源代码吗?

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

检查下面的示例:http://www.journaldev.com/957/java-zip-example-to-zip-single-file-and-a-directory-recursively

你永远不会在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();
//    }
}

我想在评论中发表这篇文章,但我没有足够的声誉。我尝试了删除文件的方法,它是可以的,但是如果你可以删除"output.txt"文件应该是因为有一个对象使用该文件,似乎你关闭了所有的流,但检查代码,我看到你使用扫描仪对象来获取appName也许这可能是问题,因为扫描仪对象指向你的"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();

我不确定新的扫描器(新的文件("output.txt"));我认为scanObject.close()也应该关闭你传递给扫描仪对象的File对象,如果没有,也试着分开,并在使用扫描仪后关闭File对象。

1)重新格式化代码…什么也看不见

2)在finally块中关闭流

<>之前尝试{...} catch(异常e) {... 处理异常} finally {关闭你必须关闭的!}之前

3)"我试图关闭所有流,因为我读到未关闭的流会阻止删除。"我猜你还有打开的文件句柄。即使是外部文件句柄也可以阻止删除。有没有防病毒程序扫描这些文件?在互联网上搜索工具来检测打开的文件句柄。

4)你也可以测试如果aFile.deleteOnExit()工作。"deleteOnExit"尝试在JVM关闭时删除文件。

好运

如果你在linux上,你可以用一些命令行版本来删除文件。

Runtime.getRuntime().exec("rm -rf");

'r'标志表示递归,意味着只从基目录开始,该命令删除目录和所有子目录。

'f'标志强制它,不会问你"你想删除xxxx.txt吗?"对于每个文件。

你也可以这样写

Runtime.getRuntime().exec("rm -rf *.java");

如果您只删除Java文件。此外,windows和mac有一个shell删除文件/删除目录命令。希望对大家有所帮助

相关内容

  • 没有找到相关文章