好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

当文件操作遇上进程占用时

当文件操作遇上进程占用时

当文件操作遇上进程占用时

 近日做文件操作时,老是抛异常说文件正在被另一个进程占用着,很无奈,给我知道是哪个进程占用的话,就把它给Kill掉,当然这样做在一定程度上是有危险的,万一占用文件的进程是那么那么地重要,就不该Kill了,因此这样的做法只能在确保安全的情况下去做,或者是Kill了进程之后带来的不良后果也无关痛痒。上网找了一下,在别的进程占用文件下读写文件的文章很多,但获取占用文章的进程就比较少,在百度上就有人说过用unlocker这种工具,这工具我没去看,感觉也不太适合在这里用吧,如果有dll,提供API那还不错。后来就在谷歌里找到了只那么一篇文章而已,看了之后还终究要用到别的exe,还得另外开进程啊。

       这个工具叫 handler ,从微软里面下载的。只是一个控制台程序而已,双击它运行就可以查看当前系统中正在运行的进程,进程ID,占用的文件等信息。如果给他输入文件名的参数,那就可以知道到时是那些进程在占用着这个文件了,列举的信息中有进程ID,这个很关键,有了pid,那Process就有希望了。

  1               //  要检查被那个进程占用的文件 
  2               string  fileName =  @"  C:\Users\Administrator\Desktop\temp\..\temp\WF英文文档(MSDN).doc  "  ;
   3               //  先格式化一下路径,免得有上面那种路径的话,程序识别不出来 
  4              fileName =  new   FileInfo(fileName).FullName;
   5              Process tool =  new   Process();
   6               //  下面这段就配置一下启动进程的相关了 
  7              tool.StartInfo.FileName =  @"  C:\Users\Administrator\Desktop\temp\handle.exe  "  ;
   8              tool.StartInfo.Arguments = fileName +  "   /accepteula  "  ;
   9              tool.StartInfo.UseShellExecute =  false  ;
  10               //  这里为了在运行的时候不会给那个程序冒出来
  11               //  Win7下不用也行,但XP就需要了 
 12              tool.StartInfo.RedirectStandardOutput =  true  ;
  13               tool.Start();
  14               tool.WaitForExit();
  15               string  outputTool =  tool.StandardOutput.ReadToEnd();
  16  
 17               //  正则提取出进程的pid 
 18               string  matchPattern =  @"  (?<=\s+pid:\s+)\b(\d+)\b(?=\s+)  "  ;
  19              MatchCollection mc =  Regex.Matches(outputTool, matchPattern);
  20               foreach  (Match match  in   mc)
  21               {
  22                   //  有了pid,想把进程怎么弄就怎么弄。 
 23                  
 24  
 25              }

  这里还插一个题外话吧,就是在关进程的时候,用Process类的话有两种方式,一种比较温柔的CloseMainWindow()方法,另一种则是比较野蛮的,Kill()方法,除非WinForm程序的,只能比较野蛮了,之前听同事说是即使用了Kill(),进程还是会杀不干净的,对Kill()和CloseMainWindow()的内部实现机制还不了解,看那个同事是说用进程通讯去关的,要知道那个窗体标题,其实这样感觉挺像用CloseMainWindow()了,但单纯地用进程通讯去关也是有缺陷的,原本那窗体的标题叫Form1的,经过一系列操作之后窗体名改了,或者加上“(未响应)”,单纯写死一个标题太不科学了。用Process实例的MainWindowTitle属性就可以获取到主窗体的标题,可万一碰到的是子窗体用ShowDialog的形式启动时,想关闭子窗体时,CloseMainWindow()、Kill()、进程通讯都做不到了。用Process实例的ProcessorAffinity属性可以获取进程的IntPtr对象,这个相当于在进程通信前调用系统API的FindWindow方法,这样用来发送一个WM_CLOSE消息也跟使用MainWindowTitle属性调用FindWindow的差不多,使用IntPtr对象的适用范围更广,其实用Kill()还是用WM_CLOSE消息,哪个强力一点,干净一点,我真知道,如果Kill()万一跟WM_CLOSE效果差不多的话,那也是Kill方便,免了声明系统API方法,IntPtr或标题那几个操作。求高人点。

 

 

分类:  未知分类

标签:  文件占用

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于当文件操作遇上进程占用时的详细内容...

  阅读:41次