下面的代码是从数据库中取数据生成N个EXCEL文件,然后吧excel文件打包成rar压缩文件,供用户下载。
在服务器上就会存在N个excel文件和一个压缩文件,想把他们统统删除,现在的程序可以删除部分,
excel文件会剩下一个或者两个无法删除,在window下手动删除提示文件被使用,
如何彻底地删除这些文件???
................
    if(type.equals("excel"))
    {
     BinaryView docBinaryView =(BinaryView)boReport.getView(OutputFormatType.XLS);    
     byte[] abyBinaryContent = docBinaryView.getContent();    
     outputStream=  new FileOutputStream(path+timePath+random+"\\"+webiDocName+".xls"); 
     outputStream.write(abyBinaryContent);  
     }
    outputStream.flush();
    outputStream.close();
    createZip(path+timePath+random,path+timePath+random+".zip");
    File zipFile=new File(path+timePath+random+".zip");
    delFolder(path+timePath+random);
    
    response.setContentType("APPLICATION/OCTET-STREAM"); 
    response.setHeader("Content-Disposition","attachment;filename=\"" + timePath+random+".zip" + "\"");
     /** 返回文件内容 */
    int BUFSIZE = 1024 * 8;    
    int rtnPos = 0;
    byte[] buffs = new byte[ BUFSIZE ];
    FileInputStream inStream =new FileInputStream(path+timePath+random+".zip");
    while((rtnPos=inStream.read(buffs)) >0)   
    response.getOutputStream().write(buffs,0,rtnPos);    
    response.getOutputStream().flush();
    response.getOutputStream().close(); 
    zipFile.delete();        
%>

解决方案 »

  1.   

    你貌似   createZip(path+timePath+random,path+timePath+random+".zip");
        File zipFile=new File(path+timePath+random+".zip");一个压缩文件就有一个excel文件  而且你生成的excel文件根本没有删除操作 ,应该在createZip
    方法里 打包完成后 删除此excel文件
      

  2.   

    delFolder(path+timePath+random);这个函数就删除了你说的excel文件及所属的文件夹public void delFolder(String folderPath)
    {   
              try {   
                  File file = new File(folderPath);   
                  if (!file.isDirectory())
                  {   
                      file.delete();   
                  }   
                  else if (file.isDirectory())
                  {   
                      String[] filelist = file.list();   
                      for(int i=0;i<filelist.length;i++)   
                      {   
                          File delfile=new File(folderPath+"\\"+filelist[i]);   
                          if(!delfile.isDirectory())   
                              delfile.delete();   
                          else if(delfile.isDirectory())   
                              delFolder(folderPath+"\\"+filelist[i]);   
                      }   
                      file.delete();   
                  }   
              }   
              catch   (Exception e)   
              {   
                  System.out.println("删除文件夹出错"); 
              }               
          }
      

  3.   

    在window下手动删除提示文件被使用,是因为文件被锁了,文件句柄被流操作所占用。才会出现你说的这样的情况。在删除zip中的部分内容后,其他文件句柄可能在内存中被程序所占用。解决办法,在操作文件之前把所有对此文件的流都关掉。
      

  4.   

    File还有一种是程序退出时删除文件的delete方法,具体查查api
      

  5.   

    彻底删除文件就是从硬盘中删除了,没你说的这么技术
    现在的问题 是 一个文件夹里有100个excel文件
    能删除90个,还有10个是没有删除成功的
    手动删除也是报的文件正在使用 不可以删除的提示
    彻底删除就是把整个文件夹统统删除掉
      

  6.   

    你这种情况,是流还没有关闭造成的。
    关于如何关闭流,你可以去我写的文章
    http://chenyong.javaeye.com/blog/288869
    里面看看。
    先关闭所有的流,然后再调用delete方法,是绝对可以删除文件的。ps:  while((rtnPos=inStream.read(buffs)) >0)   
        response.getOutputStream().write(buffs,0,rtnPos);    
        response.getOutputStream().flush();
        response.getOutputStream().close(); ServletOutputStream sos=response.getOutputStream();
    先得到流以后在做。
      

  7.   

    恩,应该是流没有关闭
    还有一种作法,就是不产生excel文件,完全在内存里面做,这样不用产生临时文件
      

  8.   

    createZip方法的代码贴出来看看,可能这儿里面有没有关闭的stream。
    虽然后面调用了deleteFolder方法,但是可能有些文件没删掉。
    f.delete()方法有返回值boolean标识是否删除成功的。