Open File Lock Handle

找出哪个进程正在使用
你的文件、文件夹或端口。

文件无法重命名或删除?oflh 会显示哪些进程正在使用它,以及这些进程背后的应用。使用 Windows、Linux 和 macOS 上的桌面应用或交互式终端应用,检查文件、文件夹、整个驱动器和本地端口。

免费开源 · Windows、Linux、macOS · x86-64 和 ARM64 · v0.8.0

OFLH 桌面版列出正在使用某个文件夹的进程,并显示所选进程的详情

适合开发者和管理员处理“文件已在另一程序中打开”“Device or resource busy”或“address already in use”等报错。

  1. 打开文件或文件夹,或拖入路径。查端口:打开端口并搜索 port:3000。
  2. 点击进程,查看其文件、端口和进程父级关系。
  3. 正常关闭该应用,或终止并确认(请先保存)。

媒体报道与软件收录

终端版和桌面版

同一个扫描引擎,同样的结果。按你的使用习惯选择。

看看 OFLH 桌面应用如何工作

文件无法删除,或服务器无法启动?从目标出发,找到正在使用它的进程及其所属应用。

Windows 截图来自 项目 README · 点击图片可放大

  1. 找到谁在使用你的文件

    选择打开文件或打开文件夹、拖入路径,或检查整个驱动器(如 C:\)。按进程名称、PID 或完整路径搜索,然后选择一行查看匹配的句柄和进程父级关系。

    在 Windows 文件资源管理器中,也可以右键点击文件或文件夹,选择检查文件或检查文件夹。

    OFLH 桌面应用在 Windows 上检查 C:\,按 Firefox 筛选,显示匹配的文件句柄和所选进程的父级关系
    桌面应用示例:Windows 上的文件与进程。
  2. 选择合适的进程操作

    通过进程父级关系找到辅助进程背后的编辑器、浏览器、终端或服务。右键点击一行可复制路径或 PID、在文件管理器中显示文件,或查看匹配的文件。

    文件被打开不等于被锁定。仅锁定证据按证据筛选;Windows 中标为持有者未经确认的行不代表已证明谁持有锁。

    Windows 上 OFLH 桌面应用的 firefox.exe 进程操作菜单,包含复制路径、复制 PID、匹配的句柄、终止和强制终止
    桌面应用示例:进程操作菜单。
  3. 停止进程前先确认

    尽可能正常关闭应用。选择终止时,确认对话框列出所有选中的进程,包括被筛选隐藏的进程,并默认选择取消。OFLH 会在操作前重新核对每个进程的身份。

    先保存工作:终止进程可能丢失未保存的更改。之后按 F5 刷新,检查文件是否仍被使用。

    OFLH 桌面应用终止 firefox.exe 的确认对话框,显示 PID、未保存工作警告以及取消和终止按钮
    桌面应用示例:终止进程前的确认对话框。
  4. 找到本地端口的持有进程

    打开端口并搜索 port:3000,查看哪个进程绑定了该端口。使用 tcp、udp 或 pid:1234 缩小列表,再选择一行查看文件和父级关系。

    端口视图显示本地 TCP 监听器和已绑定的 UDP 套接字,不显示已建立的连接,也不能证明其他机器能访问该端口。

    Windows 上 OFLH 桌面应用的本地端口视图,按 Steam 筛选,显示 TCP 监听器、已绑定的 UDP 套接字、PID、地址和进程父级关系
    桌面应用示例:本地 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 校验值检查下载文件。

下载 oflh

免费提供 Windows、Linux 和 macOS 版本,支持 x86-64 和 ARM64。

最新版本: v0.8.0 · 发布说明

桌面版

选择此版本可使用带窗口、按钮和进程列表的图形界面应用。

macOS

桌面应用

下载桌面应用.dmg · Apple 芯片
安装包Apple 芯片Intel
.dmg下载下载
macOS 安装提示

由于应用未签名,macOS 可能会提示应用“已损坏”。请在终端中运行以下命令,手动允许运行,然后重新打开应用。如果安装位置不同,请修改路径。

命令
xattr -cr "/Applications/OFLH Desktop.app"
通过 Homebrew 安装 macOS
命令
brew install --cask karimz1/tap/oflh-desktop

Homebrew tap 单独更新,可能落后于最新版本。运行 brew info 可查看将要安装的版本。

macOS 安装提示

通过 Homebrew 安装的应用也未签名。macOS 可能会阻止首次启动。

由于应用未签名,macOS 可能会提示应用“已损坏”。请在终端中运行以下命令,手动允许运行,然后重新打开应用。如果安装位置不同,请修改路径。

命令
xattr -cr "/Applications/OFLH Desktop.app"

终端版

此版本需要在终端中运行。Windows 用户请打开 PowerShell,macOS 和 Linux 用户请打开终端。双击 CLI 文件不会打开桌面应用。

通过 Homebrew 安装 macOS / Linux

命令
brew install karimz1/tap/oflh-cli

Homebrew 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 上公开。