我有一个应用程序位于networking共享文件夹中的服务器上。 networking中的许多用户可以同时使用该文件。 我想执行该EXE文件的更新,为此,我想知道谁在networking(除了我)正在使用该文件。
是否有可能以编程方式检查? 例如:要列出所有正在使用该文件的用户名? 或至less检索该文件上的锁的数量?
谢谢。
要在计算机中列出打开的共享文件,您可以使用ADSI(Active Directory Service Interfaces,活动目录服务接口)。
为了使用delphi的这些接口,你必须导入Active DS类型库
然后访问IADsFileServiceOperations
接口,该接口包含一个名为Resources
方法返回一个包含所有打开的共享资源的集合。
检查这个示例代码
{$APPTYPE CONSOLE} uses ActiveDs_TLB, Variants, ActiveX, SysUtils; function ADsGetObject(lpszPathName:WideString; const riid:TGUID; out ppObject):HRESULT; safecall; external 'activeds.dll'; procedure ListSharedResourcesInUse; var FSO : IADsFileServiceOperations; Resources : IADsCollection; Resource : OleVariant; pceltFetched : Cardinal; oEnum : IEnumvariant; begin //establish the connection to ADSI ADsGetObject('WinNT://./lanmanserver', IADsFileServiceOperations, FSO); //get the resources interface Resources := FSO.Resources; //get the enumerator oEnum:= IUnknown(Resources._NewEnum) as IEnumVariant; while oEnum.Next(1, Resource, pceltFetched) = 0 do begin Writeln(Format('Resource %s User %s',[Resource.Path,Resource.User])); Resource:=Unassigned; end; end; begin try CoInitialize(nil); try ListSharedResourcesInUse; finally CoUninitialize; end; except on E:Exception do Writeln(E.Classname, ':', E.Message); end; Writeln('Press Enter to exit'); Readln; end.
如果你真正需要的是替换一个可能正在使用的exe文件,你可以重命名该可执行文件,然后将这个新文件复制到同一个位置。 新用户将运行新的可执行文件,只要最后一个运行该文件的用户关闭应用程序,就可以删除旧的(可重命名的)可执行文件。
这可能是矫枉过正,但有一个服务器 – 客户端架构呢? 一个应用程序可以在你的服务器上运行,每当有人启动一个客户端,它就连接到服务器。
添加一个“状态/状态”的等式,可以改变到您目前的需要:正常,准备升级,升级中,等等
通过这种方式,您可以遍历打开的连接列表,并向所有人发送消息,使系统进入维护模式,或者当客户端启动时,可以通知用户发生了什么事情。
干杯
如果你启动exe,它将被锁定写入。 因此,替换或重命名exe是安全的,但如果你不能这意味着使用exe。
PsFile和“网络文件”可以显示文件是否打开,您可以关闭文件。 但是这对于启动程序的用户来说并不好。
我认为最好是创建函数发送消息给程序的所有用户。 如果您需要升级禁用新登录,并发送消息给所有用户“请退出,需要升级!”。 重试这个,直到你可以替换exe。 PsFile不能告诉谁在使用文件,但只有在使用文件的情况下。