前言:经常在删除文件时,提示文件被其他进程占用,导致一直无法删除文件
原文地址:https://www.caoayu.top/article/15518556-8be4-80d8-b1ab-d5981d3c140d
沟糟的提示
-
问题描述含糊不清:
它只告诉你“文件夹或文件正在被另一个程序使用”,但完全不说是哪个程序!
用户心声:你倒是告诉我是谁占用的啊!我不介意帮你解锁,但你得告诉我目标是谁吧!
-
缺乏高级选项:
没有提供任何进一步的帮助,比如“强制解除占用”或“打开任务管理器查看占用”。只能点“重试”或者“取消”,完全没有解决问题的办法。
用户心声:你就不能内置个任务管理器链接,直接跳过去找到罪魁祸首吗?!
-
"重试"毫无意义:
如果程序还在占用,“重试”永远失败。这个按钮几乎就是“多试几次,浪费你的时间”的同义词。
用户心声:能不能加个“试试关闭占用进程”的选项,而不是让我点“重试”徒增挫败感?
-
信息展示低效:
提示框里详细列出了文件夹的名字和创建日期,这些信息有时根本没用。用户想知道的只是“到底哪个程序在用?”
用户心声:谁在用才是重点,我不需要知道文件夹是啥时候生的!
-
用户体验缺乏优化:
如果是因为文件资源管理器(Explorer)自己占用了文件夹,这问题就更加搞笑。作为操作系统的亲儿子,占用了还不知道自家人吗?
用户心声:兄弟,你是 OS 啊!能不能给自己打个补丁?
Windows 的提示设计,总有种“我知道你遇到了麻烦,但我偏不帮你”的气质!
用户的解决
- 安装某安全软件,基本都有什么强制删除目录,解除占用之类的功能,但是大部分都没有卵用
- 通过文件夹名称查找正在占用的进程,并手动关闭,有可能是一些后台进程,需要强制结束进程。
直接介绍几种解决方案:
方案1:
- 打开资源监视器:
- 按
Ctrl + Shift + Esc
打开 任务管理器。 - 切换到 性能 标签页,点击底部的 打开资源监视器。
- 按
- 查找文件句柄:
- 切换到 CPU 标签页。
- 在 关联的句柄 (Associated Handles) 搜索框中,输入文件名或路径的一部分。
- 资源监视器会列出当前打开该文件的所有进程。
- 操作:
- 找到占用文件的进程后,可以在任务管理器中选择该进程,右键选择 结束任务 或其他操作。
方案二:
Microsoft 提供了一个工具 Sysinternals Handle,可用于查看文件句柄占用情况。
-
下载 Handle 工具:
- 从 Microsoft Sysinternals 网站 下载工具。
- 解压到本地文件夹,例如
C:\tools\
.
-
运行 Handle:
-
打开命令提示符 (CMD) 或 PowerShell。
-
进入
handle.exe
所在目录,例如:cd C:\tools
-
输入命令查找文件:替换
file_name
为目标文件名或路径的部分。handle.exe file_name
-
-
结果解析:
- 输出结果中会显示文件被哪些进程占用,包括进程的 PID(进程 ID)。
-
关闭文件占用:
-
可以根据 PID 在任务管理器中找到对应进程并关闭,或使用
handle
命令释放句柄:handle.exe -c <Handle_Number> -p <PID>
方案三:
使用第三方工具
1. Process Explorer
- 从 Sysinternals 网站 下载 Process Explorer。
- 打开工具,按
Ctrl + F
搜索目标文件名。 - 它会列出占用文件的所有进程。
2. LockHunter
- 下载 LockHunter,它专为解决文件占用问题设计。
- 右键被占用的文件,选择 What is locking this file?。
- 可以直接解锁或结束占用进程。
-
方案四:
通过 PowerShell 脚本
使用 PowerShell 脚本来查询文件占用:
powershell
复制代码
$path = "C:\path\to\file.txt"
Get-Process | Where-Object { $_.Modules } | ForEach-Object {
$_.Modules | Where-Object { $_.FileName -like "*$path*" } | ForEach-Object {
$_.FileName
Write-Output "$($_.FileName) is locked by $($_.Name)"
}
}
将 $path
替换为目标文件路径。