2012-06-22 16 views
9

Zastanawiam się, czy można było usunąć katalog po zamknięciu aplikacji?Usuwanie katalogu przy wyjściu w Javie

Czy istnieje prosty sposób na zrobienie czegoś, gdy aplikacja jest zamknięta?

Obecnie moja aplikacja pobiera pliki klas w czasie wykonywania, więc naprawdę tego potrzebuję, aby usunąć je z systemu klientów.

Próbowałem tak daleko

File directory = new File("macros/bin/"); 
directory.deleteOnExit(); 

Jak również usunąć na starcie z pobranych plików startowych (co oczywiście nie można zrobić, skoro ona potrzebuje ich w celu uruchomienia).

+0

Jeśli te pliki klas zostaną załadowane do maszyny JVM, wówczas system MS Windows prawdopodobnie nie pozwoli na ich usunięcie –

Odpowiedz

19

Można spróbować to:

Runtime.getRuntime().addShutdownHook(new Thread() { 

     @Override 
     public void run() { 
     /* Delete your file here. */ 
     } 
}); 

Wiele zależy od tego, jak program się kończy.

+1

w większości systemów, w których hak zamykający działa przy każdym wystąpieniu, ale 'kill -9', który jest oczekiwanym zachowaniem. –

+0

dziękuję, że zadziałało – Arrin

+0

Prawdopodobnie powinieneś wnieść swój wkład do Apache commons-io, ponieważ uważam, że twoja implementacja lepiej odzwierciedla rzeczywiste potrzeby. Obecna implementacja commons-io polega na rejestrowaniu plików znajdujących się w katalogu w czasie wywołania, a nie na końcu, po zakończeniu przetwarzania. –

8

Po prostu dla zapisu, javadoc mówi, że directory.deleteOnExit() powinien działać ... metoda podobno działa dla katalogów. Jednak podejście prawdopodobnie nie działa, ponieważ katalog nie jest pusty w punkcie, w którym próbuje go usunąć ... a system operacyjny zazwyczaj nie pozwala usunąć niepustego katalogu.

Rozwiązaniem byłoby wywołanie deleteOnExit() dla plików, które użytkownik również pobiera. Musisz to zrobić po z numerem telefonu directory.deleteOnExit(). Zobacz javadoc, dlaczego.

Powiedziawszy to, jawny hak zamykający jest bardziej niezawodnym podejściem.

3

należy wykonać następujące czynności przy użyciu Apache Commons IO:

Runtime.getRuntime().addShutdownHook(new Thread(() -> FileUtils.deleteQuietly(fileOrDir))); 

Uwaga: realizacja FileUtils.forceDeleteOnExit jest błędna: rejestruje pliki do usunięcia podczas rejestracji w katalogu, więc jeśli pliki zostały dodane później to będzie nie można usunąć katalogu.

0

Można to wykorzystać: org.apache.commons.io.FileUtils.forceDeleteOnExit(File)

/* 
* Schedules a file to be deleted when JVM exits. 
* If file is directory delete it and all sub-directories. 
*/ 
FileUtils.forceDeleteOnExit(File) 

Ograniczenie:
Niestety to działa tylko jeśli żadne dodatkowe pliki i/lub foldery są tworzone wewnątrz katalogu po forceDeleteOnExit nazwano.

Powiązane problemy