我有一个不断填满“artefact”文件的目录。许多不同的程序将其临时文件转储到此目录中,这些程序不太可能很快就会自动清理。
与此同时,我想写一个程序,当它们变得过时时不断删除这个目录中的文件,我将其定义为“超过30分钟”。
一种典型的方法是使用定时机制列出目录中的文件,过滤旧内容,并删除旧内容。但是,这种方法在我的情况下并不是非常高效,因为这个目录可能包含10个或数十万个尚未符合陈旧条件的文件。因此,这种方法将不断循环使用相同的数千个文件来查找旧文件。
我真正喜欢做的是实现某种目录侦听器,该侦听器已通知添加到目录中的任何新文件。然后,此侦听器将这些文件添加到队列中以便在路上删除。但是,似乎没有办法在我编程的语言中实现这样的解决方案(Java和Scala等JVM语言)。
所以:我正在寻找一种最有效的方法来保持Windows上“尽可能干净”的目录,最好是使用JVM语言。此外,虽然我从未使用Powershell编程,但如果它提供这种功能,我会考虑它。最后,如果有第三方工具来做这些事情,我想听听它们。
感谢。
答案 0 :(得分:4)
为什么不能首先发布最早排序的目录system command: c:> dir / OD
获取结果并删除所有超过阈值的文件,或者如果没有足够大的文件,则将其休眠。
将Timer or Executor设置与粒度1秒组合 - 1分钟,这样可以保证文件不会比删除文件更快堆积。
答案 1 :(得分:2)
如果您不想编写C ++,可以使用Python。安装pywin32然后您可以使用win32 API:
import win32api, win32con
change_handle = win32api.FindFirstChangeNotification(
path_to_watch,
0,
win32con.FILE_NOTIFY_CHANGE_FILE_NAME
)
Tim Golden在此详细解释如何处理该问题:http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html
。
答案 2 :(得分:2)
在Java中,您还可以使用Apache Commons JCI FAM。它是一个可以免费使用的开源java库。
JDK 7(目前在测试版中发布)还包括对文件通知的支持。查看Java NIO2 tutorial。
这两个选项都适用于Windows和Linux。
答案 3 :(得分:1)
答案 4 :(得分:0)
我会使用C ++来实现这样的实用程序 - 让您与WIN32 API接口,它确实具有目录侦听功能(FindFirstChangeNotification或ReadDirectoryChangesW)。使用一个侦听更改通知的线程并更新文件列表(iirc FFCN要求您重新扫描文件夹,而RDCW会为您提供实际更改)。
如果你按照修改时间对这个列表进行排序,那么Sleep()只需要足够长的时间就可以使文件过时,而不是以某个随机的固定间隔进行轮询。您可能希望使用超时而不是睡眠来执行WaitForSingleObject,以便对外部更改作出反应(即,您正在等待变为陈旧的文件已在外部删除,因此您需要唤醒并确定何时 next 文件将变得陈旧。
听起来像一个有趣的小工具:)
答案 5 :(得分:0)
您可能想要咬紧牙关并在C#(或VB)中对其进行编码。 FileSystemWatcher课程很好地处理了你所要求的内容。它基本上按照你描述的方式工作。在将文件添加到目录中时注册文件。有一个定期计时器,扫描文件列表中的过期,并删除它们,如果它们仍然存在。我可能将其编码为在服务ID下运行的Windows服务,该服务ID具有足够的权限来读取/删除目录中的文件。
编辑:快速谷歌出现了FileSystemWatcher for Java。商业软件。从未使用它,因此无法评论其工作情况。