
Open File Lock Handle
找出哪个进程正在使用
你的文件、文件夹或端口。
文件无法重命名或删除?oflh 会显示哪些进程正在使用它,以及这些进程背后的应用。使用 Windows、Linux 和 macOS 上的桌面应用或交互式终端应用,检查文件、文件夹、整个驱动器和本地端口。
适合开发者和管理员处理“文件已在另一程序中打开”“Device or resource busy”或“address already in use”等报错。
- 打开文件或文件夹,或拖入路径。查端口:打开端口并搜索
port:3000。 - 点击进程,查看其文件、端口和进程父级关系。
- 正常关闭该应用,或终止并确认(请先保存)。
oflh ./build# 谁占用 ./build 下的内容oflh 'C:\'# 整个 C: 盘(PowerShell)oflh --port 3000# 谁在监听 3000 端口
媒体报道与软件收录

终端版和桌面版
同一个扫描引擎,同样的结果。按你的使用习惯选择。
找到谁在使用你的文件
选择打开文件或打开文件夹、拖入路径,或检查整个驱动器(如
C:\)。按进程名称、PID 或完整路径搜索,然后选择一行查看匹配的句柄和进程父级关系。在 Windows 文件资源管理器中,也可以右键点击文件或文件夹,选择检查文件或检查文件夹。

桌面应用示例:Windows 上的文件与进程。 选择合适的进程操作
通过进程父级关系找到辅助进程背后的编辑器、浏览器、终端或服务。右键点击一行可复制路径或 PID、在文件管理器中显示文件,或查看匹配的文件。
文件被打开不等于被锁定。仅锁定证据按证据筛选;Windows 中标为持有者未经确认的行不代表已证明谁持有锁。

桌面应用示例:进程操作菜单。 停止进程前先确认
尽可能正常关闭应用。选择终止时,确认对话框列出所有选中的进程,包括被筛选隐藏的进程,并默认选择取消。OFLH 会在操作前重新核对每个进程的身份。
先保存工作:终止进程可能丢失未保存的更改。之后按
F5刷新,检查文件是否仍被使用。
桌面应用示例:终止进程前的确认对话框。 找到本地端口的持有进程
打开端口并搜索
port:3000,查看哪个进程绑定了该端口。使用tcp、udp或pid:1234缩小列表,再选择一行查看文件和父级关系。端口视图显示本地 TCP 监听器和已绑定的 UDP 套接字,不显示已建立的连接,也不能证明其他机器能访问该端口。

桌面应用示例:本地 TCP 和 UDP 端口的持有者。
为什么使用 oflh?
找到占用文件或端口的应用,了解它正在使用什么,再决定关闭哪个程序。
文件、文件夹、整个磁盘
让 oflh 检查一个文件、一个文件夹或 C:\。检查文件夹时会覆盖其中所有内容,并显示每个进程如何使用它:打开的文件、映射的文件、可执行文件,或(在 Linux 和 macOS 上)工作目录。
端口
oflh --port 3000 显示该端口上的 TCP 监听或已绑定的 UDP 套接字,以及对应的 PID 和地址。oflh 直接读取套接字表,不调用 lsof、ss 或 netstat。
父进程树
每个结果都带有父进程链,可以把 node 或 dotnet 工作进程追溯到启动它的编辑器、终端或服务。
打开不等于锁定
锁定证据与普通的打开文件分开显示。当 Windows 无法证明是哪个进程持有锁时,结果会标注“持有者未经确认”,而不是猜测。
谨慎对待你的进程
oflh 从不关闭其他进程内部的句柄。它会请求应用自行关闭,或在确认后终止进程(默认选中“取消”),并在操作前重新核对 PID 和启动时间。
本地运行,开源
扫描只在你的电脑上进行。使用 Rust 编写,采用 MIT 许可证,并在 x86-64 和 ARM64 的原生 Windows、Linux 和 macOS runner 上测试。
lsof、handle.exe 和 Process Explorer 的替代工具
lsof 和 fuser 用于 Linux 和 macOS,资源监视器、Process Explorer 和 handle.exe 用于 Windows。它们都是好工具。oflh 的不同之处有三点:
三个系统,同一个界面
在 Windows、Linux 和 macOS 上用同样的方式查找占用文件或端口的进程,然后直接在应用中选中并关闭它,无需把 PID 复制到
kill或taskkill。整盘扫描,无需遍历目录
oflh 在设计时就把速度作为重点优化:它将运行中的进程持有的文件与目标路径比对,而不是遍历磁盘。在我们自己的测量中,扫描整个
C:\或/耗时 195–510 ms。锁定证据与“文件已打开”分开
打开的文件和实际的锁定证据分开显示。当 Windows 无法证明是哪个进程造成共享冲突时,结果会标注“持有者未经确认”,而不是猜测一个进程。
整盘扫描,不到一秒
oflh 针对速度做了专门优化。它不遍历目录树,而是向操作系统查询每个运行中的进程持有哪些文件,因此扫描整个 C:\ 或 / 与扫描一个小文件夹的耗时相差无几。
- Windows x64 ·
C:\ - 352 ms
- Windows ARM64 ·
C:\ - 510 ms
- Linux x86-64 ·
/ - 195 ms
包含 2,048 个文件、其中 128 个被打开的 Windows 文件夹(五次运行的中位数):此前的 Restart Manager 后端 → 当前后端
- x64 Restart Manager 后端: 3,303 ms 当前后端: 315 ms
- ARM64 Restart Manager 后端: 5,384 ms 当前后端: 353 ms
以下均为我们自己的测量:2026 年 10 月 5–6 日的单次后端测量(Windows 使用 GitHub runner,Linux 使用本地电脑),不含应用启动。硬件、进程数量和权限都会影响结果。 测量方法、原始数据和复现步骤 →
要扫描整个磁盘,像打开普通文件夹一样打开 C:\ 或 / 即可。 快速上手 ↑
局限:oflh 做不到的事
下载之前值得了解。
暂不支持脚本
两个版本都是交互式的:终端版未连接到终端时会报错退出,也没有 JSON 输出,因此不能直接用于脚本或 CI。
只能看到当前账户有权查看的内容
其他用户的进程或受系统保护的进程可能不会显示;扫描不完整时会提示“结果可能不完整”。以提升的权限运行可以看到更多。
Windows 无法总是确定锁的持有者
共享冲突只能证明文件受到限制,无法证明是哪个进程造成的。这类结果会标注“持有者未经确认”。
仅限本地端口
端口指 TCP 监听和已绑定的 UDP 套接字,不包括已建立的连接,也不代表该端口能否从其他机器访问。
安装程序未签名
发布文件没有代码签名,也没有经过公证,因此 Windows 可能显示“未知发布者”,macOS 可能阻止应用运行。放行之前,请先对照
checksums.txt中的 SHA-256 校验值检查下载文件。
桌面版
选择此版本可使用带窗口、按钮和进程列表的图形界面应用。
Windows
桌面应用
下载桌面应用安装程序 · x86-64| 安装包 | x86-64 | ARM64 |
|---|---|---|
| 安装程序 | 下载 | 下载 |
macOS
桌面应用
下载桌面应用.dmg · Apple 芯片| 安装包 | Apple 芯片 | Intel |
|---|---|---|
.dmg | 下载 | 下载 |
由于应用未签名,macOS 可能会提示应用“已损坏”。请在终端中运行以下命令,手动允许运行,然后重新打开应用。如果安装位置不同,请修改路径。
xattr -cr "/Applications/OFLH Desktop.app"Linux
桌面应用
下载桌面应用.deb · x86-64| 安装包 | x86-64 | ARM64 |
|---|---|---|
.deb | 下载 | 下载 |
.rpm | 下载 | 下载 |
.tar.gz | 下载 | 下载 |
通过 Homebrew 安装 macOS
brew install --cask karimz1/tap/oflh-desktopHomebrew tap 单独更新,可能落后于最新版本。运行 brew info 可查看将要安装的版本。
通过 Homebrew 安装的应用也未签名。macOS 可能会阻止首次启动。
由于应用未签名,macOS 可能会提示应用“已损坏”。请在终端中运行以下命令,手动允许运行,然后重新打开应用。如果安装位置不同,请修改路径。
xattr -cr "/Applications/OFLH Desktop.app"终端版
此版本需要在终端中运行。Windows 用户请打开 PowerShell,macOS 和 Linux 用户请打开终端。双击 CLI 文件不会打开桌面应用。
Windows
终端版本(CLI / TUI)
下载终端版本.exe · x86-64| 安装包 | x86-64 | ARM64 |
|---|---|---|
.exe | 下载 | 下载 |
macOS
终端版本(CLI / TUI)
下载终端版本Apple 芯片| 安装包 | Apple 芯片 | Intel |
|---|---|---|
| 可执行文件 | 下载 | 下载 |
Linux
终端版本(CLI / TUI)
下载终端版本x86-64| 安装包 | x86-64 | ARM64 |
|---|---|---|
| 可执行文件 | 下载 | 下载 |
通过 Homebrew 安装 macOS / Linux
brew install karimz1/tap/oflh-cliHomebrew tap 单独更新,可能落后于最新版本。运行 brew info 可查看将要安装的版本。
选择与你的操作系统和处理器匹配的文件。它是单个可执行文件,无需安装。将其重命名为 oflh(Windows 上为 oflh.exe),在 macOS 和 Linux 上赋予执行权限,并把所在文件夹加入 PATH。
运行终端版
无需安装:将下载的文件重命名,然后在它所在的文件夹中运行。
macOS / Linux
mv ./oflh-cli.darwin.arm64 ./oflh
chmod +x ./oflh
./oflh ./build示例为 Apple 芯片。Intel Mac:oflh-cli.darwin.amd64。Linux:oflh-cli.linux.amd64 或 oflh-cli.linux.arm64。
Windows · PowerShell
Rename-Item .\oflh-cli.windows.amd64.exe oflh.exe
.\oflh.exe .\build示例为 x86-64。ARM64:oflh-cli.windows.arm64.exe。
发布文件没有代码签名,也没有经过公证,因此 Windows 可能显示“未知发布者”,macOS 可能阻止应用运行。放行之前,请先对照 checksums.txt 中的 SHA-256 校验值检查下载文件。 安装说明.
常见问题
各操作系统能检测到什么、不能检测到什么: 平台支持 →
在 Windows 上如何找出哪个进程正在使用某个文件?
Windows 会提示“进程无法访问此文件,因为另一个程序正在使用此文件”或“文件已在另一程序中打开”,但不会告诉你是哪个程序。在 PowerShell 中运行 oflh 路径\文件,或在 OFLH 桌面版中打开该文件,就能看到所有正在使用它的进程,包括将其作为模块加载的程序。“锁定文件”视图会显示该文件是否存在读取、写入或删除共享冲突。要检查文件夹或整个磁盘,传入文件夹或 C:\ 即可。
如何找出哪个进程占用了端口?
当服务器因“address already in use”(EADDRINUSE)无法启动时,运行 oflh --port 3000。它会显示该端口上的 TCP 监听或已绑定的 UDP 套接字,以及 PID、进程名和地址;oflh --ports 会列出全部端口。在桌面版中,打开“端口”视图并搜索 port:3000。只显示本地绑定,不显示已建立的连接。
“Device or resource busy”是什么意思?如何解决?
某个进程仍在你要删除或卸载的路径中打开了文件、建立了内存映射,或把工作目录设在其中。对该路径运行 oflh,即可看到是哪些进程、各自如何使用它,以及是哪个应用启动了它们,然后关闭或停止正确的进程。“Text file busy”表示有进程正在运行该文件,它会显示为可执行文件。
能一次扫描整个 C:\ 或 / 吗?
可以。在 PowerShell 中运行 oflh 'C:\',在 Linux 上运行 oflh /,或在桌面版中通过“打开文件夹”选择根目录。oflh 比对的是进程的实时引用,而不是遍历磁盘,因此在我们自己的测量中,整盘扫描耗时在 195 到 510 ms 之间。参见测量数据。
打开的文件就是被锁定的文件吗?
不是。“进程”视图列出所有引用目标的进程;“锁定文件”(桌面版中的“仅锁定证据”)则需要实际的锁定证据:Linux 上的 POSIX、flock 或 OFD 锁,macOS 上的字节范围冲突,Windows 上的共享冲突。Windows 并不总能证明是哪个进程造成了共享冲突,这类结果会标注为“持有者未经确认”。
oflh 能在不关闭程序的情况下解锁文件吗?
不能。强行关闭其他进程内部的句柄可能破坏该程序的状态,所以 oflh 不这样做。它会显示进程及其背后的应用,让你正常关闭,或在确认后终止它(默认选中“取消”)。请先保存工作:终止进程可能导致未保存的更改丢失。
如何找到后台进程背后的应用?
选择该进程并查看它的父进程树,从最早记录的父进程一直到所选进程。它能把 node 或 dotnet 这类工作进程关联到启动它的编辑器、终端或服务。在终端版中按 Tab 聚焦进程树。无法识别的父进程会标注为不可用。
需要管理员或 root 权限吗?
不需要。oflh 以普通用户身份运行,显示当前账户有权检查的进程;有进程无法读取时,会提示“结果可能不完整”。以提升的权限运行可以看到更多进程。终止进程被拒绝时,桌面版会提供“以管理员权限重试”。
可以在脚本中使用 oflh 吗?
目前还不行。两个版本都是交互式的:终端版未连接到终端时会报错退出,也没有 JSON 输出。
oflh 会上传我的文件或扫描结果吗?
不会。扫描在本地进行,文件名、文件内容、进程数据和结果都留在你的电脑上。正式版会从本网站获取一个小型 JSON 文件来检查新版本,GitHub 作为备用来源,请求中不包含任何路径或进程数据。终端版可用 --no-update-check 关闭检查。源代码和构建日志在 GitHub 上公开。


