监视某目录下,哪个文件变化了.(300分)

  • 主题发起人 主题发起人 睢志强
  • 开始时间 开始时间

睢志强

Unregistered / Unconfirmed
GUEST, unregistred user!
找了很多资料 也在大富翁 Google Baidu 没少搜索.<br>但是都只能监视变化, 不知道到底哪个文件发生变化.<br>我要监视的目录 目录结构是这样的. 各个客户端 利用 FTP 不断更新这些文件.<br>H:/Data/单位1/Data.txt<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Info.txt<br>H:/Data/单位2/Data.txt<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Info.txt<br>H:/Data/单位3/Data.txt<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Info.txt<br>.............<br><br>等等很多单位.<br>以前是有多少个文件就建立多少个线程, 虽然实现的很好, 但是 CPU 占用太高.<br><br>看见不少人用<br>FindFirstChangeNotification<br>FindNextChangeNotification<br>FindCloseChangeNotification<br>来实现,但是还是不能得到到底修改哪个文件了.<br>比如说 一个新文件 或者文件内容改变了.<br><br>在此谢谢各位朋友. 希望能给出 具体办法 或者 DEMO.<br>ApiHook 暂时不考虑.
 
沙发<br>听课<br>顶一下
 
这个似乎可以,但是C++的,懂的过来看看.<br>http://blog.csdn.net/Caviler/archive/2006/06/12/791714.aspx
 
可以考虑自己维护一张文件创建修改时间表,在发生变化时进行对比,应该可以找出哪个是新建文件,哪个文件是最新被修改了的.
 
这个办法我先过了,最开始我是用一个线程实现监视,类似您说的那样.<br>取时间需要用 CreateFile API<br>但是遇到文件正在被 FTP 更改, 这个 API 会卡 400 毫秒左右.<br>而我有 500 多个单位, 1000 多个文件, 一分钟每个文件要更新3次. 就是有 3000 次的变化.<br>去循检 根本不能达到要求. 反映不及时.<br>换每个文件一个线程 又太占用 CPU
 
一分钟每个文件更新3次,?<br><br>每个每次文件你都需要捕捉吗?在一分钟内最多需要捕捉并且处理3000次,你认为cpu能有足够的时间执行变化后的操作吗?<br><br>就算有,你的cpu占用率也将非常之高。。<br><br>考虑一下你是否应该重新考虑一下你的做法:<br><br>楼上这个方法是最直接的,可行<br>可以考虑自己维护一张文件创建修改时间表,在发生变化时进行对比,应该可以找出哪个是新建文件,哪个文件是最新被修改了的<br><br>碰到卡的问题,先用下面这个函数先判断文件是否在使用中。。这样就不卡了。。<br><br>function IsFileInUse(FileName: TFileName): Boolean;<br>var<br> &nbsp; HFileRes: HFILE;<br>begin<br> &nbsp; Result := False;<br> &nbsp; if not FileExists(FileName) then Exit;<br> &nbsp; HFileRes := CreateFile(PChar(FileName),<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GENERIC_READ or GENERIC_WRITE,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nil,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OPEN_EXISTING,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FILE_ATTRIBUTE_NORMAL,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0);<br> &nbsp; Result := (HFileRes = INVALID_HANDLE_VALUE);<br> &nbsp; if not Result then<br> &nbsp; &nbsp; &nbsp;CloseHandle(HFileRes);<br>end;
 
那不还是用到 CreateFile 函数了 就这个卡.<br>检测完 不用这个机器处理 把消息发到 TCP 服务器,然后 有几个机器 分布处理 这些变化数据.
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=693107<br>急!请问如何监视系统对文件的访问? <br><br>一哥 先生的回答 通过注册系统消息实现监视文件以及目录变动, 但是文件大小改变做不到, 只能监视到目录变了,而且反映有点慢.<br>easydigi 的回答 是使用 API HOOK 但是这样 如果挂钩子时候 文件已经打开 就记录不到文件名....<br><br>AHLKJ 说 IFS Kit - Installable File System Kit 可以搞定,的确可以搞定 但是居然需要写驱动......
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2257807<br>关于对服务器共享文件操作的监视<br><br>根据这里 alys 朋友写贴的代码 大概实现了这个功能 效果也不错,<br>明天进行进一步的研究。
 
vs.Net 2005 里头可以实现,专门有一个控件。而且没怎么占用cpu,叫做 FileSystemWatcher,可以监视目录、文件的创建、修改、删除等等变化。
 
我实现是实现了 但是..........<br>Serv-U 上传文件 会触发两次 变化。 我分辨不出哪个是。
 
是在 vs.Net 里实现的吗?如果是,请看一下你的响应事件是哪个?另:目录中的内容发生变化,也会触发目录修改的事件。
 

Similar threads

后退
顶部