Ultraedit,相信大部分开发人员都比较熟悉吧?各位在实用的过程中有没有注意到ultraedit较强的关联性呢?比如说,ultraedit已经打开了a.txt文件,此时在另外一个程序中对a.txt做了更改,ultraedit就能马上提示a.txt已被其他应用程序改变,提示用户是否需要重新载入。相信使用过ultraedit的人对这个印象比较深。这个功能是怎么实现的呢?在这里笔者略述一二。
要实现这样的功能,其实很简单,无怪乎调用系统函数,查看文件状态,比较文件更改时间等等,但总不至于用一线程一直读取文件状态吧?其实可以使用文件系统的事件通知机制来实现。
(1)对于dotnet应用来说,可以通过使用fileSystemWatcher组件来实现,只需要设置Path,Filter等属性,实现Changed,Created,deleted,renamed等事件即可。注意,Path指要监控的文件目录,Filter指文件类型,在这里可以使用通配符,比如*.*等等
(2)对于非dotnet应用,可以使用系统的文件操作,通过FindFirstChangeNotification,FindNextChangeNotification ,FindCloseChangeNotification,以及相应的Wait Functions(包括 SignalObjectAndWait, WaitForSingleObject, and WaitForSingleObjectEx 以及 WaitForMultipleObjects, WaitForMultipleObjectsEx, MsgWaitForMultipleObjects, and MsgWaitForMultipleObjectsEx )来实现和fileSystemWatcher同样的功能,具体使用方法请参阅MSDN
在一些涉及到文件处理的程序中如果也能加上这种关联功能,则给用户的印象就比较深,而且更容易为用户所接受