如何监视一个文件的内容发生了变化?(100分)

  • 主题发起人 叮叮当当
  • 开始时间

叮叮当当

Unregistered / Unconfirmed
GUEST, unregistred user!
我试过开一个线程通过判断文件尺寸或日期的方法监视文件是否被更改,但实时性不是很好,我想应该有一种类似HOOK的方法把某个文件的修改关联到事件里去。请大家多多指教!<br>
 
使用 Windows 未公开的函数:<br><br>const Shell32DLL = 'shell32.dll';<br><br>function SHChangeNotifyRegister; external Shell32DLL Index 2;<br><br>使用:它只能监视文件夹的变化,不过文件变化的时候也会得到通知,<br>&nbsp; 你只需要在得到通知的时候判断一下文件名就达到你的要求了。<br>SHChangeNotifyRegister(AControl.Handle,<br>&nbsp; SHCNF_ACCEPT_INTERRUPTS + SHCNF_ACCEPT_NON_INTERRUPTS,<br>&nbsp; EventMask, fMessageNo, NotifyCount, NotifyPtr);<br><br>第一个参数是接收相应消息的窗口或控件句柄,第二个参数为标志<br>第三个参数指定需要得到通知的文件变化过滤条件:<br>&nbsp; EventMask := SHCNE_ATTRIBUTES or SHCNE_RENAMEITEM or <br>第四个参数是当文件变化的时候发送给你的消息号,可自定义,<br>&nbsp; 如:WM_USER + 123<br>第五个参数指定监视的文件夹个数,根据你的要求,传 1 进去即可<br>最后一个参数是接收通知用的缓冲区,包含发生变化的实际内容,<br>&nbsp; 本来是一个数组,以你的需求,只需要指向一个条目的指针即可<br>&nbsp; 这个指针定义如下:<br>&nbsp; TNotyfyItem = record<br>&nbsp; &nbsp; pidlPath: PItemIDList;<br>&nbsp; &nbsp; bWatchSubtree: boolean;<br>&nbsp; end;<br>&nbsp; PNotyfyItem = ^TNotyfyItem;<br><br>当你得到消息的时候,把 WParam 参数强制转换为 PITEMIDLIST 类型,然后<br>通过如下函数对其进行转换即可。<br>&nbsp; &nbsp;function ParsePidl(pIDL: PITEMIDLIST): string;<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp;SetLength(Result, MAX_PATH);<br>&nbsp; &nbsp; &nbsp;if not SHGetPathFromIDList(pIDL,PChar(Result)) then<br>&nbsp; &nbsp; &nbsp; &nbsp;Result := '';<br>&nbsp; &nbsp;end;<br><br>OK,没有必要说的更细了,你先研究一下再说吧。遇到问题再问吧。<br>
 
http://www.vclxx.org/DELPHI/D32SAMPL/DIRMON.ZIP
 
有现成的控件,叫什么DMMonitor吧,你找找看
 
那些是监视文件夹的。<br>然后在自己判断一下吧
 
ShellChangeNotifier控件啊,在samples页面, D6和D7里都有现成的, 还有例子.
 
谢谢大家!
 
顶部