使用 LockHunter 解决文件占用问题

对于第三方自动升级工具,主要的功能是更新第三方系统程序文件。在第三方系统停止后,更新程序文件时,经常出现的情况是“该程序文件被占用,无法完成”。要解决该占用问题,就需要找出是哪个进程占用程序文件,然后再 kill 掉进程。一旦解决掉占用问题,程序文件就能正常更新了。

如何找出占用文件的进程?

曾一度使用微软官方的提供的工具 handle,存在两方面的不足,一是查询进程信息缓慢,且经常查无结果(最大问题),二是只能通过真正运行的文件查询进程,无法通过被引用的文件查询进程。什么意思呢,比如说系统的执行文件为 demo.exe,而该执行文件运行时还引用了文件 democore.dll。当该系统运行时, demo.exe 和 democore.dll 都被该系统进程占用,使用 handle 只能通过 demo.exe 查询被占用的进程,而通过 democore.dll 无法查询结果。故弃用。

后来发现 LockHunter 非常好用,参见官方下载地址用户手册。先一睹为快,如下图示:

lockhunter示例图
lockhunter示例图

图为使用 LockHunter 查询并退出 Redis 客户端工具,通过 rdm.exe 或 Qt5Core.dll 文件均可查询并结束进程。从官方用户手册得到命令行选项说明:

  • /unlock 或 -u : 解锁文件或者卸载 dll;
  • /delete 或 -d :删除文件 ;
  • /delperm 或 -dp : 永久删除文件,不使用回收站;
  • /kill 或 -k : 终止来自给定文件夹以及所有子文件夹的进程运行;
  • /silent 或 -sm : 静默运行,不显示窗口;
  • /exit 或 -x :不使用静默运行时,任务执行完毕后不自动退出

PS:为避免出现“用户账户控制”弹窗,建议以管理员身份运行 cmd 窗口。

如果要使用 C# 执行上述指令,可参考如下代码:

namespace Pzy.Helpers 
{ 
   /// <summary> 
   /// 应用程序辅助类 
   /// </summary> 
   public class ProcessHelper 
   { 
       /// <summary> 
       /// 使用LockHunter退出进程 
       /// 参考资料:https://lockhunter.com/manual.htm 
       /// </summary> 
       /// <param name="fileOrDirectoryPath">文件或目录路径</param> 
       public static void ExitProcessByLockHunter(string fileOrDirectoryPath) 
       { 
           try 
           { 
               using (var tool = new Process()) 
               { 
                   tool.StartInfo.FileName = CommonHelper.PathCombine(CommonHelper.BaseDirectory,  
    @"LockHunter\LockHunter.exe"); 
                   tool.StartInfo.Arguments = $" -k -sm \"{fileOrDirectoryPath}\""; 
                   tool.StartInfo.UseShellExecute = false; 
                   tool.StartInfo.RedirectStandardOutput = false; 
                   tool.StartInfo.Verb = "RunAs"; 
                   tool.StartInfo.CreateNoWindow = true; 
                   tool.Start(); 
               } 
           } 
           catch (Exception ex) 
           { 
               // TODO: 
           } 
       } 
   } 
}

全文完。

《使用 LockHunter 解决文件占用问题》的相关评论

发表评论

必填项已用 * 标记,邮箱地址不会被公开。