Какой самый эффективный метод постоянного удаления файлов старше X часов в Windows? - PullRequest
5 голосов
/ 16 июля 2009

У меня есть каталог, который постоянно заполняется файлами "артефактов". Многие разные программы сбрасывают свои временные файлы в этот каталог, и маловероятно, что эти программы станут самоочищающимися в ближайшее время.

Тем временем я хотел бы написать программу, которая постоянно удаляет файлы в этом каталоге, когда они устаревают, и я определю их как «старше 30 минут».

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

Что бы я действительно хотел бы сделать, так это реализовать какой-нибудь прослушиватель каталога, который был уведомлен о любых новых файлах, добавленных в каталог. Затем этот слушатель добавляет эти файлы в очередь для удаления в будущем. Однако, похоже, нет способа реализовать такое решение на языках, на которых я программирую (языки JVM, такие как Java и Scala).

Итак: я ищу наиболее эффективный способ сохранить каталог "настолько чистым, насколько это возможно" в Windows, предпочтительно с языком JVM. Кроме того, хотя я никогда не программировал с Powershell, я бы подумал, если бы он предлагал такую ​​функциональность. Наконец, если есть инструменты сторонних производителей для таких вещей, я хотел бы услышать о них.

Спасибо.

Ответы [ 6 ]

4 голосов
/ 16 июля 2009

Почему вы не можете выдать каталог системная команда , отсортированная по самому старому: c:> dir / OD

Возьмите результаты и удалите все файлы старше вашего порогового значения или спите, если ни один файл не является достаточно старым.

Добавьте к этому Timer или Executor , настроенный на гранулярность 1 секунда - 1 минута, что гарантирует, что файлы не будут накапливаться быстрее, чем вы можете их удалить.

2 голосов
/ 16 июля 2009

В Java вы также можете использовать Apache Commons JCI FAM . Это Java-библиотека с открытым исходным кодом, которую вы можете использовать бесплатно.

JDK 7 (выпущенный в настоящее время в бета-версии) также включает поддержку файловых уведомлений. Ознакомьтесь с Учебник по Java NIO2 .

Оба варианта должны работать как в Windows, так и в Linux.

2 голосов
/ 16 июля 2009

Если вы не хотите писать на C ++, вы можете использовать Python. Установите pywin32 , и вы сможете использовать win32 API следующим образом:

import win32api, win32con
change_handle = win32api.FindFirstChangeNotification(
    path_to_watch,
    0,
    win32con.FILE_NOTIFY_CHANGE_FILE_NAME
)

Полное объяснение того, что делать с этой ручкой Тимом Голденом, здесь: http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html.

1 голос
/ 16 июля 2009
0 голосов
/ 16 июля 2009

Возможно, вы захотите прикусить пулю и закодировать ее в C # (или VB). То, о чем вы просите, довольно хорошо обрабатывается классом FileSystemWatcher . Это будет работать в основном так, как вы описываете. Зарегистрируйте файлы по мере их добавления в каталог. Иметь периодический таймер, который сканирует список файлов на наличие устаревших и удаляет их, если они все еще там. Я, вероятно, закодировал бы его как службу Windows, работающую под идентификатором службы, у которого достаточно прав для чтения / удаления файлов в каталоге.

РЕДАКТИРОВАТЬ : быстрый Google обнаружил этот FileSystemWatcher для Java . Коммерческое программное обеспечение. Никогда не использовал его, поэтому не могу комментировать, насколько хорошо он работает.

0 голосов
/ 16 июля 2009

Я бы пошел с C ++ для такой утилиты, которая позволяет вам взаимодействовать с WIN32 API, который действительно имеет возможности прослушивания каталогов (FindFirstChangeNotification или ReadDirectoryChangesW). Используйте один поток, который прослушивает уведомления об изменениях и обновляет список файлов (iirc FFCN требует от вас повторного сканирования папки, тогда как RDCW выдает фактические изменения).

Если вы сохраняете этот список отсортированным по времени изменения, становится легко переходить в спящий режим () достаточно долго, чтобы файл стал устаревшим, вместо опроса через некоторый случайный фиксированный интервал. Возможно, вы захотите сделать WaitForSingleObject с тайм-аутом вместо Sleep, чтобы реагировать на внешние изменения (т. Е. Файл, который вы ждете, чтобы стать устаревшим, был удален извне, поэтому вам нужно проснуться и определить следующий файл станет устаревшим).

Звучит как забавный маленький инструмент для записи:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...