使用C#关闭打开的文件我有一种情况,人们连接到共享上的文件,它阻止我覆盖文件。我正在尝试编写一种方法来查看我提供的文件路径当前是否以这种方式锁定并关闭与该资源的网络会话。我查看了ADSIWinnt提供程序,但没有实现Resources.Remove成员。然后我查看了Win32_ServerSession,虽然我能够使用Delete成员,但它会杀死给定用户的所有资源。我需要弄清楚如何更具体。我一直在走GetRelationsShips和Properties,但我现在被难住了。很难考虑这样做的所有后果,因为您无法预测当前锁定文件的应用程序的最终行为。还有别的办法吗?例如,您是否必须立即覆盖文件,或者您是否有一些外部进程每隔几分钟就不断尝试覆盖文件直到成功?我遇到了同样的问题。到目前为止,据我所知,唯一的方法是使用Win32API:我做了一个简短的尝试来让它工作,我可以直接枚举文件,但在我的代码中——我只是在看它——关闭文件的代码被设置为注释。如果你试试这个,我可以发送一个库[NetFileXXXwrapper]和一个简短的演示,但是,正如我所说:我从不关闭文件。但这可能是一条捷径。我不知道,如何在stackoverflow上交换文件:-(?!?BR–mabra您可以使用提供文件完整路径的代码,它将返回锁定该文件的任何内容的列表:使用System.Runtime.InteropServices;使用系统.Diagnostics;静态公共类FileUtil{[StructLayout(LayoutKind.Sequential)]structRM_UNIQUE_PROCESS{publicintdwProcessId;publicSystem.Runtime.InteropServices.ComTypes.FILETIMEProcessStartTime;}constintMAXRebootReason5CHNone=0;CCH_RM_MAX_SVC_NAME=63;枚举RM_APP_TYPE{RmUnknownApp=0,RmMainWindow=1,RmOtherWindow=2,RmService=3,RmExplorer=4,RmConsole=5,RmCritical=1000}[StructLayout(LayoutKind.RM_PROCESS_INFO{publicRM_UNIQUE_PROCESSProcess;[MarshalAs(UnmanagedStr.ByValTSizeConst=CCH_RM_MAX_APP_NAME+1)]publicstringstrAppName;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=CCH_RM_APP_SVC_NAME+1PE)]publicStringAppName阳离子型;公共uintAppStatus;公共单位TSSessionId;[MarshalAs(UnmanagedType.Bool)]publicboolbRestartable;}[DllImport("rstrtmgr.dll",CharSet=CharSet.Unicode)]staticexternintRmRegisterResources(uintpSessionHandle,UInt32nFiles,string[]rgsFilenames,UInt32nApplications,[In]RM_UNIQUE_PROCESS[]rgApplications,UInt32nServices,字符串[]rgsServiceNames);[DllImport("rstrtmgr.dll",CharSet=CharSet.Auto)]staticexternintRmStartSession(outuintpSessionHandle,intdwSessionFlags,stringstrSessionKey);[DllImport("rstrtmgr.dll")]staticexternintRmEndSession(uintpSessionHandle);[DllImport("rstrtmgr.dll")]staticexternintRmGetList(uintdwSessionHandle,outuintpnProcInfoNeeded,refuintpnProcInfo,[In,Out]RM_PROCESS_INFO[]rgAffectedApps,refuintlpdwRebootReasons);//////找出哪些进程锁定了指定的文件。//////文件的路径。///进程锁定文件///另见:///http://msdn.microsoft.com/en-us/library/windows/desktop/aa373661(v=vs.85).aspx///http://wyupdate.googlecode.com/svn-history/r401/trunk/frmFilesInUse.cs(查看时代码没有版权)//////staticpublicListWhoIsLocking(stringpath){uinthandle;字符串键=Guid.NewGuid().ToString();列出进程=newList();intres=RmStartSession(outhandle,0,key);if(res!=0)thrownewException("无法开始重新启动会话。无法确定文件柜。");尝试{constintERROR_MORE_DATA=234;uintpnProcInfoNeeded=0,pnProcInfo=0,lpdwRebootReasons=RmRebootReasonNone;字符串[]资源=新字符串[]{路径};//只检查一个资源。res=RmRegisterResources(handle,(uint)resources.Length,resources,0,null,0,null);if(res!=0)thrownewException("无法注册资源。");//注意:这里有一个竞争条件——第一次调用RmGetList()返回//进程总数。然而,什么然后我们再次调用RmGetList()以获取//这个数字可能增加的实际进程。res=RmGetList(句柄,输出pnProcInfoNeeded,refpnProcInfo,null,reflpdwRebootReasons);if(res==ERROR_MORE_DATA){//创建一个数组来存储处理结果RM_PROCESS_INFO[]processInfo=newRM_PROCESS_INFO[pnProcInfoNeeded];pnProcInfo=pnProcInfoNeeded;//获取列表res=RmGetList(handle,outpnProcInfoNeeded,refpnProcInfo,processInfo,reflpdwRebootReasons);if(res==0){processes=newList((int)pnProcInfo);//枚举所有结果并将它们添加到要返回的//列表中for(inti=0;i然后,迭代进程列表并关闭它们:string[]files=Directory.GetFiles(target_dir);ListlstProcs=newList();foreach(stringfileinfiles){lstProcs=ProcessHandler.WhoIsLocking(file);if(lstProcs.Count>0)//处理文件锁{foreach(ProcesspinlstProcs){if(p.MachineName==".")ProcessHandler.localProcessKill(p.ProcessName);elseProcessHandler.remoteProcessKill(p.MachineName,txtUserName.Text,txtPassword.Password,p.ProcessName);}}}并取决定文件是否在本地计算机上:}}或网络计算机:publicstaticvoidremoteProcessKill(stringcomputerName,stringfullUserName,stringpword,stringprocessName){varconnectionoptions=newConnectionOptions();connectoptions.Username=fullUserName;//@"你的域名用户名";connectoptions.Password=pword;ManagementScopescope=newManagementScope(@"\"+computerName+@"rootcimv2",connectionoptions);//WMI查询varquery=newSelectQuery("select*fromWin32_processwherename='"+processName+"'");使用(varsearcher=newManagementObjectSearcher(scope,query)){foreach(ManagementObjectprocessinsearcher.Get()){process.InvokeMethod("Terminate",null);处理.处置();}}}参考文献:如何寻找使用锁定文件的.NET进程?删除有人打开文件的目录。以上就是C#学习教程:用C#关闭打开的文件共享,不代表立场,如涉及侵权,请点击右侧联系管理员删除如转载请注明出处:
