如何关闭被其它程序打开的文件(200分)

  • 主题发起人 主题发起人 jiashenglv
  • 开始时间 开始时间
J

jiashenglv

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个重要的数据文件,已知文件名(比如password.db),该文件可以被'DBD32.exe'打开,也可以被用户自己开发的其它程序打开。应用程序检测到该文件已经被某个程序打开,如果提示让用户自己去关闭它是不明智的选择。如何知道它是被哪个程序/进程打开的,并关闭相应的程序或进程?<br><br>判断文件是否被其他程序打开:<br>var<br>&nbsp;HFileRes:HFILE;<br>&nbsp;Result:Boolean;<br>&nbsp;fName:string;<br>begin<br>&nbsp;fName:='d:/password.db';<br>&nbsp;Result:=false;<br>&nbsp;if not FileExists(fName) then<br>&nbsp; &nbsp;exit;<br>&nbsp;HFileRes:=CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, <br>&nbsp; &nbsp;0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);<br>&nbsp;Result:=(HFileRes=INVALID_HANDLE_VALUE);<br>&nbsp;if not Result then CloseHandle(HFileRes)<br>&nbsp;else ShowMessage('文件正在被使用!');<br>end;<br><br>关闭DBD32进程:<br>uses<br>&nbsp;Tlhelp32;<br>...<br>var<br>&nbsp;Snap:THandle;<br>&nbsp;PPro:TPROCESSENTRY32;<br>&nbsp;h:Hwnd;<br>&nbsp;Found:Boolean;<br>begin<br>&nbsp;Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);<br>&nbsp;Found:=Process32First(Snap,PPro);<br>&nbsp;while Found do<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp;if UpperCase(ExtractFileName(PPro.szExeFile))='DBD32.EXE' then<br>&nbsp; &nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;h:=OpenProcess(PROCESS_ALL_ACCESS,true,PPro.th32ProcessID);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TerminateProcess(h,0);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ShowMessage(IntToStr(h));<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Caption:='Already Killed';<br>&nbsp; &nbsp; &nbsp; &nbsp;end;<br>&nbsp; &nbsp; &nbsp;Found:=Process32Next(Snap,PPro);<br>&nbsp; &nbsp;end;<br>end;<br>(如果是这样就简单了...)<br><br>可是,如何捕获password.db正在被其它程序(比如'Me.exe',该程序的名称是未知的)使用,并关闭该程序?<br><br>分数不够可以再加!!!
 
基本上不大可能, 除非更改系统内核设置。<br>你可以看看Windows带的工具,它提供监视每一个进程打开了哪些文件的功能:<br>http://www.szonline.net/content/2003/200308/20030806/198966.html<br>有时监视每一个进程打开了哪些文件也是非常有用的。在以前的Windows中,我们可以安装资源工具包的oh.exe。但在XP中,虽然Support Tools的帮助文件提到了oh.exe,安装好的Support Tools却不带oh.exe。但是,XP提供了一个新的Openfiles命令行工具(Openfiles.exe),它能够报告进程打开的各个文件。和oh.exe相似,Openfiles也要求打开系统内核监视,而这会消耗一些内存,降低文件、打印、邮件、数据库等操作的性能。打开系统监视的命令是openfiles /local on,它会启用系统全局标志“维护对象列表”,需要重新启动系统才能生效(你可以执行gflags.exe查看Openfiles命令设置了哪些标志)。<br>重新启动系统后,不带参数执行Openfiles就可以看到一个进程清单以及各个进程打开的文件(包括共享文件),图五就是Openfiles执行结果的一个片断。如果要查看哪个用户正在运行打开文件的进程,执行openfiles /query /v,<br><br>也就是说微软已经提供了这样的工具,但要求打开系统内核监视,而这会消耗一些内存,降低文件、打印、邮件、数据库等操作的性能。<br>根据这个列表,你就可以找出你的文件被谁打开了,然后把它关闭即可。
 
to xianjun:<br>&nbsp; 非常感谢,只好改变程序的结构了。
 
to xianjun:<br>&nbsp;
 
其實,如果Hook CreateFile,OpenFile等api,是可知道是那個程序打開的,但這樣會否小韙大做???我估計 xianjun 說的,也是這種方法而已!!
 

Similar threads

后退
顶部