在 linux 下可以通过 lsof 查看文件占用,Windows 下有什么工具可以快速定位文件被哪个进程占用?
当文件被某个进程打开后,当删除文件时会提示无法删除:
这里演示的是 pdf 文件被进程占用的情况,在提示框中可以知道是被 “Kingsoft Pdf" 占用。在现实环境中这里可能并不会显示有用的程序名。我们此时需要定位到进程ID,必要时通过进程ID杀掉进程来解除资源占用。
微软的 handle 程序可以快速定位文件或文件夹的占用情况。handle 程序下载地址:
https://download.sysinternals.com/files/Handle.zip
这是一个命令行程序,需要在命令行 cmd 中执行该程序。默认会打印所有的句柄信息:
handle64.exe -nobanner
参数 -nobanner 是所有 sysinternals 工具集中的程序都有的参数,默认输出会打印程序的版权信息,可以通过 -nobanner 关闭版权信息。
使用 handle 可以对文件和目录进行检索,查看文件或目录被哪个进程占用,使用方法是在 handle 命令后面接文件名或目录的绝对路径:
C:\> handle64.exe -nobanner 数据说明.pdfwpspdf.exe pid: 23848 type: File 7DC: C:\Users\Administrator\Downloads\Handle\????.pdfC:\> handle64.exe -nobanner C:\Users\Administrator\Downloads\Handleexplorer.exe pid: 11940 type: File 944: C:\Users\Administrator\Downloads\Handleexplorer.exe pid: 11940 type: File 5B4C: C:\Users\Administrator\Downloads\Handlecmd.exe pid: 22520 type: File 98: C:\Users\Administrator\Downloads\Handlewpspdf.exe pid: 23848 type: File 7DC: C:\Users\Administrator\Downloads\Handle\????.pdfhandle64.exe pid: 9672 type: File 44: C:\Users\Administrator\Downloads\Handle
直接在 handle 程序后面接被占用的文件名即可定位到进程。如果文件名含中文,handle 程序的输出会有乱码,这个不影响使用。handle 命令可以定位到进程 ID 以及进程的可执行文件名,通过这两个要素我们就可以关闭进程,解除资源占用了,我们可以在任务管理器或 tasklist 中查看进程是否存在。
C:\> tasklist fi "pid eq 23848"映像名称 PID 会话名 会话# 内存使用========================= ======== ================ =========== ============wpspdf.exe 23848 Console 2 172,076 KC:\> tasklist fi "IMAGENAME eq wpspdf.exe"映像名称 PID 会话名 会话# 内存使用========================= ======== ================ =========== ============wpspdf.exe 23848 Console 2 172,076 K我们可以使用 tasklist 命令查看进程信息,同时也可以使用 taskkill 命令杀掉进程,指定进程ID或可执行文件名都可以杀进程,以下命令二选一即可:
C:\> taskkill /f /pid 23848 C:\> taskkill /f /im wpspdf.exe如果想在 handle 程序中查看对应进程的完整信息,可以通过进程ID或进程可执行文件名进行查看,以下两个命令效果相同:
handle64.exe -nobanner -p 23848 handle64.exe -nobanner -p wpspdf.exe
除了使用 taskkill 杀进程,也可以使用 handle 程序杀掉占用文件的句柄,其中要用到进程ID和句柄号(16进制)。
handle64.exe -nobanner -p 23848 -c 7DC
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。