2014-06-21 2 views
2

나는 나의 서블릿 (output.txt)에서와 XSL 파일 (폴더 generatedApps과 컨텐츠) 다음 ZIP 아카이브에 XSL 변환에 의해 생성 된 파일과 폴더를 팩에서 일부 파일을 생성하고있다. 클라이언트가 ZIP 아카이브를 다운로드 한 후에 다른 파일 및 폴더뿐만 아니라 삭제하려고합니다. (BTW, 아카이브 내부에왜 일부 파일 및 폴더 만 삭제되지 않습니까?

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 압축 파일이 삭제된다는 점이다 :

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은 다음과 같다 :

내 코드입니다 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

... – jamp

+0

문제는도 (삭제를 추가하여 –

+0

시작 폴더 내부에서 내 파일을 삭제하지 않는다는 것입니다) 폴더가 비어있는 경우 질문에 코드를 수정하고 계속 진행하십시오. :) 또한 delete()가 'true'를 반환하는지 확인하십시오. – jamp

답변

1

Zip 유틸리티가 파일을 제대로 닫고 있는지 확인할 수 있습니다 ... ZipUsingJavaUtil 클래스 소스에 액세스 할 수 있습니까?

  • zip 파일의 각 항목을 닫아야합니다.
  • 우편 작성 프로세스를 위해 열리는 모든 파일 입력 스트림은 이어야합니다.

확인 아래 예제 : 당신이 디렉토리를 제거하지 코드에서 http://www.journaldev.com/957/java-zip-example-to-zip-single-file-and-a-directory-recursively

+0

위의 코드에 집중되어 있으므로 지퍼 클래스를 보지 않았습니다 ... 감사합니다. ! –

1

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(); 
// } 
} 
+0

removeDirectory (aFile)에 대한 재귀 호출; 맞았습니다. – jamp

+0

알아 차렸습니다. 고쳤다. – PandaConda

+0

당신의 충고에 따라 ... 여전히 작동하지 않습니다. –

1

의견에 게시하고 싶지만 충분한 평판이 없습니다. 나는 파일을 삭제하려고 귀하의 방법을 시도했지만 괜찮 았지만 "output.txt"파일을 삭제할 수 있다면 파일을 사용하는 개체가 있기 때문에 모든 스트림을 닫지 만 코드를 확인하면 사용하는 것으로 보입니다. Scanner 객체가 "output.txt"파일을 가리키고 있기 때문에 appName을 가져 오는 Scanner 객체가 문제 일 수 있습니다.

변경이 :

이런 일에 대한
String appName = new Scanner(new File("output.txt")).useDelimiter("\\Z").next(); 

: 나는() 새로운 파일 ("경우 output.txt") 새로운 스캐너에 대해 확실하지 않다

Scanner scanObject = new Scanner(new File("output.txt")); 
String appName = scanObject.useDelimiter("\\Z").next(); 
scanObject.close(); 

; scanObject.close()는 스캐너 객체에 전달할 File 객체도 닫아야한다고 생각합니다. 그렇지 않은 경우 File 객체를 분리 한 다음 스캐너를 사용한 후에 File 객체를 닫으십시오.

+0

이것은'output.txt' 파일로 도우 려는데 XSLT가 생성되었습니다 파일이 아직 있습니다 ... –

+0

마지막 업데이트를 보았습니다. 제대로 작동해야한다고 생각합니다. 폐쇄되지 않은 스트림이 보이지 않으므로 saxon에 버그가 있습니다. http://stackoverflow.com/questions/17998881/saxon-xslt -transformation-how-to-close-outputstream-when-transf-during-transfo 어쩌면 다른 버전을 시도해 볼 수도 있습니다. –

0

1) 코드를 다시 포맷하십시오.마지막으로 A 동 내에서 스트림을 닫습니다) 아무것도에게

2를 볼 수

 
try { 
    ... 
} catch (Exception e) { 
    ... handle your exception 
} finally { 
    close what you have to close! 
} 

3) "내가하지 폐쇄 스트림 삭제를 방지 읽었습니다 때문에, 모든 스트림을 종료했습니다." 글쎄, 아직 파일 핸들이 열려있는 것 같아. 외부 파일 핸들조차도 삭제를 막을 수 있습니다. 파일을 검사하는 바이러스 백신 프로그램이 있습니까? 열린 파일 핸들을 감지 할 수있는 도구를 인터넷에서 검색하십시오.

4) aFile.deleteOnExit()가 작동하는지 테스트 할 수도 있습니다. "deleteOnExit"는 JVM 종료시 파일을 삭제하려고 시도합니다.

행운

0

당신이 리눅스에 있다면 대신 파일을 삭제하는 몇 가지 명령 줄 버전을 할 수 있습니다.

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

'r'플래그는 재귀를 의미하며, 단지베이스에서 시작한다는 것을 의미하며이 명령은 디렉토리와 모든 하위 디렉토리를 제거합니다.

'f'플래그는 강제로 "xxxx.txt를 삭제 하시겠습니까?"라고 묻지 않습니다. 모든 파일에 대해. 당신은 자바 파일을 삭제하는 경우

당신은 또한

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

과 같은 작업을 수행 할 수 있습니다. 또한 windows 및 mac 쉘 삭제 파일/디렉토리 명령을 삭제합니다. 희망이 있습니다

관련 문제