关于系统文件监视的几个问题(一)-方案选择

原创
2013/05/30 14:50
阅读数 532

    最近遇到一个关于系统文件监视的问题:如何做到对文件的修改、新增、删除做监视然后通知用户,然后有两个核心的问题,1.如何监视的时候不发生I/O或者少发生I/O;2.对文件修改可能是非法的因此可能会伪造修改时间等等。这个问题是一次面试引申出来, 这里先不谈I/O问题和伪造问题,先看看如果做到对文件系统的监视,不限于Dotnet 或者 Java,这里以Dotnet 为例,穿插说说Java。

    1. 最初想到的方案是 定时扫描,这样就无关平台了,指定目录后,程序定时去扫描目录下的所有文件和目录,然后与程序存储的上一次扫描结果比对,上次扫描有本次没有就是删除的,本次扫描多的就是新增的,修改时间不一致的就是有更改的。
     这样会有几个问题,1. 效率低下,比对的时候会导致两次循环,如果文件过多,会导致一次任务周期过长,2.对磁盘持续的操作,每次扫描会把本没有修改的文件也扫描一次。

     方案一是被动式的监视,暂时方案备用。

    2. 利用.net frameword, jdk 平台提供的功能,例如Dotnet 有个 filesystemwatcher 类 查看这里,java nio有java.nio.file.WatchService 查看这里,需要Java 7 的 NIO 2 。 这两个方案可以称之谓主动式的监视,核心就是监视文件的时候,自定义事件绑定到,监视类上,如果有文件修改,发生特定事件通知用户,即执行绑定的自定义事件。这样可以只关注发生更改的文件(注1)。

    方案二减少了I/O,可以使用。

    3. 操作系统级别的能力。
    操作系统本身提供了监视文件系统变更的API,例如windows 查看这里;linux 查看这里 。
    然后通过 java jni 或者 dotnet dllimport 方式调用非托管代码,获取操作系统级别监视的能力。
    这个和方案二类似,减少了I/O,而且是系统级别的能力,性能上有很大提高。

这样初步可以选择方案二和三,那么还需要关注几个问题:

   1. 例如注1提到的这种主动式的监视是否真的减少了I/O操作呢,底层是怎么实现的?了解之后可以在方案二和方案三种做出选择,当然我们是基于Donet的程序,优先考虑Donet 原生实现。

   2. 还有一个问题我们一直没有谈到,如果是伪造的更改呢,相同的修改时间相同的大小? 这样是否能监视到


展开阅读全文
加载中

作者的其它热门文章

打赏
0
8 收藏
分享
打赏
0 评论
8 收藏
0
分享
返回顶部
顶部