Удалить временные файлы при запуске

Моей программе требуется временная папка для хранения данных во время работы. Эти данные не нужны после выхода из программы и должны быть удалены. Каждому запущенному экземпляру программы нужна отдельная папка.

Если я использую file.deleteOnExit(), это не гарантирует, что файл будет удален при любом сбое. Таким образом, моя идея состоит в том, чтобы проверять старые временные файлы при запуске, которые не были удалены, и удалять их. Но при запуске другого экземпляра программы он не должен удалять временные файлы все еще работающих программ. Как я могу этого добиться?

Чтобы быть более конкретным: временные файлы должны находиться в системном каталоге temp и должны быть удалены, если программа завершается нормально. Этот вопрос касается только нескольких случаев сбоя программы. Программа должна быть независимой от ОС. Решение, использующее классы Path вместо File, является предпочтительным.


person piegames    schedule 03.04.2017    source источник


Ответы (2)


Что ж, я предлагаю создать при запуске для каждого приложения приватную директорию, где хранить временные файлы, скажем, /var/run/myapp/tmp.

И при запуске удалите содержимое каталога:

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

Вы по-прежнему можете удалить содержимое каталога при выходе из приложения, но таким образом, даже если при выходе очистка не была выполнена правильно, вы обязательно получите пустой каталог при запуске.

person freedev    schedule 03.04.2017

Обычно это плохая идея, чтобы ваше приложение имело несколько экземпляров, если вам нужно полагаться на другие общие ресурсы, такие как временный файл. Например, если у вас уже есть два экземпляра приложений, по третьему только что открытому будет сложно сказать, является ли он третьим и жив ли другой экземпляр.

Как вы сказали, deleteOnExit() не будет очищать временный файл в случае сбоя JVM, а Java не предоставляет надежный способ автоматической очистки временного файла.

Итак, у меня есть следующие предложения:

  • If you can choose to make only one instance of application with multiple windows:
    • You can have a fixed location and clean it when startup. But, in this way, you may give up some portability of Java.
    • Если ваше приложение является приложением с графическим интерфейсом, вы можете создать временный файл через Java API и зарегистрировать какое-либо чистое действие при закрытии основного фрейма и т. д. - все равно не сможете справиться с некоторыми аварийными ситуациями.
    • вы можете добавить shutdownHook - по-прежнему не справляется с некоторыми аварийными ситуациями
  • Если вы настаиваете на наличии нескольких экземпляров, а ваше приложение является приложением с графическим интерфейсом: необходимо использовать Java API для создания временного файла и может добавить прослушиватель или shutdownHook.
person Tony    schedule 03.04.2017
comment
Из-за того, как разработан код, невозможно заставить его запускать несколько экземпляров одного и того же процесса в разных окнах, как вы предложили, даже если это хорошая идея. - person piegames; 03.04.2017
comment
@piegames Как мы уже говорили, нет надежного способа удалить временный файл при выходе, поэтому мы должны удалить его при запуске. Насколько я знаю, наличие нескольких экземпляров почти сделает эту работу невыполнимой. - person Tony; 03.04.2017
comment
Программа может поместить временную метку в файл во временном каталоге и обновлять ее каждую минуту в фоновом потоке. Если отметка времени старше ~5 минут, папка может быть удалена новыми экземплярами. - person piegames; 03.04.2017
comment
@piegames Мне любопытно, как создать эти разные временные каталоги, если пользователь откроет 100 экземпляров? - person Tony; 03.04.2017
comment
Вот моя попытка: codereview.stackexchange.com/q/160002/135603. Я все еще тестирую его, но пока он выглядит хорошо. - person piegames; 09.04.2017