2017-04-03 13 views
1

내 프로그램을 실행하는 동안 데이터를 저장하려면 임시 폴더가 필요합니다. 이 데이터는 프로그램 종료 후 필요하지 않으므로 삭제해야합니다. 실행중인 각 프로그램 인스턴스마다 하나의 폴더가 필요합니다.시작시 임시 파일 삭제

file.deleteOnExit()을 사용하는 경우 어떤 종류의 충돌에서도 파일이 삭제되지 않습니다. 따라서 내 생각은 시작시에 삭제되지 않은 이전 임시 파일을 확인하고 제거하는 것입니다. 그러나 프로그램의 다른 인스턴스를 시작할 때 아직 실행중인 프로그램의 임시 파일을 삭제해서는 안됩니다. 이것을 어떻게 할 수 있습니까?

자세한 내용 : 임시 파일은 시스템의 임시 디렉터리에 있어야하며 프로그램이 정상적으로 종료되면 삭제해야합니다. 이 질문은 프로그램이 충돌 한 몇 시간 동안 만 발생합니다. 이 프로그램은 OS 독립적이어야합니다. File 클래스 대신 Path 클래스를 사용하는 것이 좋습니다.

답변

0

글쎄, 각 임시 파일을 저장하는 개인 디렉터리를 각 응용 프로그램마다 시작하여 /var/run/myapp/tmp이라고 말하는 것이 좋습니다.

그리고 시작 디렉토리 내용 삭제 :

void purgeDirectory(File dir) { 
    for (File file: dir.listFiles()) { 
     if (file.isDirectory()) purgeDirectory(file); 
     file.delete(); 
    } 
} 

당신은 출구 정리에 당신이 확신이 제대로 수행되지 않은 경우에도 응용 프로그램 출구에서 디렉토리 내용을 삭제 자유롭게 남아 있지만이 방법을 시작할 때 빈 디렉토리가 있어야합니다.

0

일반적으로 임시 파일과 같은 다른 일반적인 리소스에 의존해야하는 경우 응용 프로그램에 여러 인스턴스가 있도록하는 것이 좋지 않습니다. 예를 들어 앱이 이미 두 개있는 경우 세 번째 앱이 세 번째 앱인지 여부와 다른 인스턴스가 아직 살아 있는지 여부를 알 수 없습니다.

당신이 말했듯이, deleteOnExit()은 JVM이 충돌하고 Java가 임시 파일을 자동으로 정리하는 안정적인 방법을 제공하지 않으면 임시 파일을 정리하지 않습니다. 여러 창으로 응용 프로그램의 인스턴스를 만들기 위해 선택할 수있는 경우

  • :
    • 당신은 고정 된 위치를 가질 때 시작을 정리할 수 있습니다

      그래서 나는 다음과 같은 제안을합니다. 그러나 이런 방식으로 Java의 이식성을 포기할 수 있습니다.

    • 응용 프로그램이 GUI 응용 프로그램 인 경우 Java API를 통해 임시 파일을 만들고 주 프레임을 닫을 때 등등의 정리 작업을 등록 할 수 있습니다. - 여전히 충돌 상황을 처리하지 못합니다.
    • shutdownHook - still 일부 충돌 상황을 처리하지 못함
  • 응용 프로그램이 GUI 응용 프로그램 인 경우 : Java API를 사용하여 임시 파일을 만들고 리스너 또는 shutdownHook을 추가해야합니다.
+0

코드가 설계된 방식으로 인해 제안 된 것처럼 다른 프로세스에서 여러 인스턴스를 실행할 수 없습니다 (권장 사항이지만). – piegames

+0

@piegames 이미 논의한 것처럼 종료시 임시 파일을 삭제할 수있는 확실한 방법이 없기 때문에 시작할 때 삭제해야합니다. 여러 인스턴스를 갖는 것은 내가 아는 한이 작업을 거의 불가능하게 만듭니다. – Tony

+0

프로그램은 임시 디렉토리에있는 파일에 시간 소인을 넣고 백그라운드 스레드에서 매분마다이를 업데이트 할 수 있습니다.타임 스탬프가 ~ 5 분보다 오래된 경우 폴더가 새 인스턴스에 의해 삭제 될 수 있습니다. – piegames