Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';在Windows上持续删除超过X小时的文件的最有效方法是什么?_Java_Windows_Algorithm_Scala_Filesystems - Fatal编程技术网

Java 什么';在Windows上持续删除超过X小时的文件的最有效方法是什么?

Java 什么';在Windows上持续删除超过X小时的文件的最有效方法是什么?,java,windows,algorithm,scala,filesystems,Java,Windows,Algorithm,Scala,Filesystems,我有一个目录,其中不断充满“人工制品”文件。许多不同的程序将其临时文件转储到此目录中,并且这些程序不太可能在短时间内自动清理 同时,我想编写一个程序,在这个目录中的文件过时时不断删除它们,我将其定义为“超过30分钟” 一种典型的方法是使用一种定时机制,列出目录中的文件,过滤旧内容,并删除旧内容。但是,在我的例子中,这种方法的性能不是很好,因为这个目录可能包含10个或数十万个文件,这些文件还不符合过时的条件。因此,这种方法将不断地在相同的数千个文件上循环查找旧文件 我真正想做的是实现某种类型的目录

我有一个目录,其中不断充满“人工制品”文件。许多不同的程序将其临时文件转储到此目录中,并且这些程序不太可能在短时间内自动清理

同时,我想编写一个程序,在这个目录中的文件过时时不断删除它们,我将其定义为“超过30分钟”

一种典型的方法是使用一种定时机制,列出目录中的文件,过滤旧内容,并删除旧内容。但是,在我的例子中,这种方法的性能不是很好,因为这个目录可能包含10个或数十万个文件,这些文件还不符合过时的条件。因此,这种方法将不断地在相同的数千个文件上循环查找旧文件

我真正想做的是实现某种类型的目录侦听器,该侦听器会收到添加到目录中的任何新文件的通知。然后,这个侦听器会将这些文件添加到队列中,以便在以后删除。然而,在我编写的语言(Java和Scala等JVM语言)中似乎没有实现这种解决方案的方法

因此:我正在寻找在Windows上保持目录“尽可能干净”的最有效方法,最好使用JVM语言。而且,虽然我从来没有用PuxBek编程,但如果它提供了这种功能,我会考虑它。最后,如果有第三方的工具来做这些事情,我想听听他们


谢谢。

< P>我会和C++一起使用这样的工具——让你与Win32 API接口,它确实有目录监听设备(FinFrimeToStinoCosi化或RerecDirectYrangeSew)。使用一个线程侦听更改通知并更新文件列表(iirc FFCN要求您重新扫描文件夹,而RDCW提供实际更改)

如果您根据修改时间对该列表进行排序,则很容易使Sleep()的时间长到足以使文件过时,而不是以某个固定的随机间隔进行轮询。为了对外部更改做出反应(即,您等待的文件已从外部删除,因此您需要唤醒并确定下一个文件何时变为陈旧文件),您可能需要使用超时来执行WaitForSingleObject,而不是休眠


听起来像是一个有趣的小工具:)

你可能想咬紧牙关,用C#(或VB)编写代码。你的要求得到了全班的很好的处理。它将基本上按照您描述的方式工作。在将文件添加到目录中时注册文件。有一个定期计时器,扫描文件列表中过时的文件,如果文件仍然存在,则将其删除。我可能会将其编码为Windows服务,在服务id下运行,该id有足够的权限读取/删除目录中的文件


编辑:一个快速的谷歌搜索到了这个。商业软件。从来没有使用过它,所以不能评论它的工作原理。

< P>如果你不想写C++,你可以使用Python。安装,然后您可以使用win32 API,如下所示:

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

蒂姆·戈尔登(Tim Golden)在这里对如何处理该句柄进行了完整的解释:。

为什么您不能首先发布一个按最旧版本排序的目录: c:>dir/OD

获取结果并删除所有早于阈值的文件,如果没有足够大的文件,则执行睡眠

将其与粒度设置为1秒-1分钟相结合,以确保文件堆积的速度不会超过删除它们的速度。

在Java中,您也可以使用。这是一个开源java库,您可以免费使用

JDK 7(目前以beta版发布)还支持文件通知。退房


这两个选项都可以在Windows和Linux上使用。

谢谢Kelly。在100k文件上,使用AgeFilter调用listFiles()大约需要3分钟。使用dir/OD,然后解析我需要的文件的结果字符串(按时间),持续运行大约4秒。大进步!谢谢大家的精彩回答。就我的具体情况而言,在Windows上,使用java ProcessBuilder和正确的系统命令的组合最终比使用传统的基于java的AgeFilter方法快得多。手表服务正是我想要的。我想我的程序最终将是一个组合:1)使用Kelly的系统命令建议“在启动时查找所有旧文件”,然后2)一旦运行,它将使用WatchService将要删除的文件添加到队列中。太好了。我建议不要使用系统命令行。使用
File.lastModified
和这里推荐的变体:msaed,我从listFiles和AgeFilter开始,但是在大目录上,它的速度非常慢。我不喜欢使用system命令,但在我的具体情况下,它要快得多