Каков наиболее эффективный способ непрерывного удаления файлов, более старых, чем X часов в Windows?

5
задан dajobe 16 July 2009 в 01:01
поделиться

6 ответов

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

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

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

4
ответ дан 14 December 2019 в 01:14
поделиться

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

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

0
ответ дан 14 December 2019 в 01:14
поделиться

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

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

0
ответ дан 14 December 2019 в 01:14
поделиться

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

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

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

2
ответ дан 14 December 2019 в 01:14
поделиться

Если вы не хотите писать 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.

2
ответ дан 14 December 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: