V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
clow
V2EX  ›  Windows

rmx:给 Windows 换一个能用的删除

  •  
  •   clow · 1 天前 · 1362 次点击

    Windows 的文件删除功能有多难用,做开发的大概都有体会。

    删个 node_modules 得等上好几秒甚至十几秒,进度条一格一格地挪。碰上某个文件被进程占用,直接弹个"操作无法完成,因为文件已在另一个程序中打开",然后你得自己去找到底是哪个进程锁的,打开任务管理器翻一圈,杀掉再回来重试。

    rmx 就是来解决这两件事的:删得快删得掉

    它到底做了什么

    rmx 是一个 Windows 下的命令行文件删除工具,Rust 写的,开源( MIT )。

    速度上,它绕过了 Windows 的高层文件 API ,直接调用底层的 CreateFileW + SetFileInformationByHandle,再配合 FILE_DISPOSITION_POSIX_SEMANTICS 这个标志位实现即时删除——文件在命名空间里直接消失,不用等所有句柄关闭。整个删除过程多线程并行,目录扫描和文件删除分层调度。

    实际跑下来是什么效果?在 5301 个文件( 5000 文件 + 301 目录)的测试里,rmx 用了 514 毫秒,PowerShell 的 Remove-Item 用了 1150 毫秒。快了一倍多。

    文件占用这块更直接:加一个 --kill-processes 参数,rmx 通过 Windows Restart Manager API 自动识别锁住文件的进程,干掉它,再删。不用你自己去查。

    不只是命令行

    说实话,一个命令行删除工具对大多数人吸引力有限。rmx 真正有意思的地方在于它可以直接替代 Windows 资源管理器的删除功能

    跑一下 rmx init,它会注册一个 Shell 扩展到 Windows 右键菜单。之后你在资源管理器里右键任意文件或文件夹,会多出一个 "Delete with rmx" 的选项。

    日常使用方式完全不变——还是右键、点删除,但背后走的是 rmx 的并行引擎。该快的快了,该能删的也能删了。对不想碰命令行的人来说,这才是真正有用的功能。

    具体能干什么

    基本删除

    # 删文件夹
    rmx ./node_modules
    
    # 一次删多个
    rmx ./target ./node_modules ./dist
    
    # 删单个文件
    rmx ./log.txt
    

    处理文件占用

    # 自动杀掉占用进程再删除
    rmx --kill-processes ./locked_directory
    
    # 递归 + 强制 + 杀进程,一把梭
    rmx -rf --kill-processes ./path
    
    # 只解除占用不删除(调试时有用)
    rmx --unlock ./locked_file.txt
    

    右键菜单集成

    # 注册到 Windows 资源管理器右键菜单(需要管理员权限)
    rmx init
    

    跑完之后就能右键删了,不用再开终端。

    其他

    # 预览模式,看看要删什么但不真删
    rmx -n ./node_modules
    
    # 查看删除统计
    rmx -v --stats ./target
    
    # 自升级
    rmx upgrade
    

    安全方面

    rmx 内置了保护机制,删不了 C:\WindowsC:\Program Files 这些系统目录,也删不了用户主目录。没加 -f 的话删除前会要求确认。不用担心手滑把系统搞坏。

    安装

    最简单的方式是用 Scoop:

    scoop bucket add rmx https://github.com/zerx-lab/rmx
    scoop install rmx
    

    也可以用 Cargo:

    cargo install --git https://github.com/zerx-lab/rmx
    

    或者直接去 GitHub Releases 下载编译好的二进制。

    装完建议跑一下 rmx init 把右键菜单注册上,日常用起来最方便。

    技术要求

    • Windows 10 1607 或更高版本
    • NTFS 文件系统

    谁适合用

    • 前端开发,天天跟 node_modules 打交道的
    • Rust 开发,target 文件夹动不动几个 G 的
    • 任何经常碰到"文件被占用删不掉"的人
    • 想要一个更快的右键删除的普通用户

    GitHub: https://github.com/zerx-lab/rmx

    协议:MIT

    21 条回复    2026-02-08 19:00:32 +08:00
    pigletfly
        1
    pigletfly  
       23 小时 50 分钟前
    和 robcopy 相比呢?
    geelaw
        2
    geelaw  
       23 小时 46 分钟前   ❤️ 6
    > 文件占用这块更直接:加一个 --kill-processes 参数,rmx 通过 Windows Restart Manager API 自动识别锁住文件的进程,干掉它,再删。

    看了一眼实现,好疯狂。你已经知道 Restart Manager 了,为什么还要暴力结束禁止,而不是用 RM API 要求程序停止并重启呢?

    > 它绕过了 Windows 的高层文件 API ,直接调用底层的 CreateFileW + SetFileInformationByHandle

    这就是高层 API 吧,除非你想说 WinRT 或者 shell 对象操作。

    > 日常使用方式完全不变——还是右键、点删除

    大多数人用的是 Delete 和 Shift+Delete ,而且这个程序的删除和用户通常的删除意思很不同(后者是移动到回收站)。

    另外看了一眼 shell extension 的注册代码,也相当暴力。楼主是否知道 shell extension 可以被任意具有“打开”文件对话框的程序加载?是否知道用户的 shell 不一定是 explorer.exe ?强行关闭其他进程的句柄相当于让整个 session (非管理员) / boot (管理员) 都出于非一致状态,惟一恢复的方法是重启系统。

    而且这整个注册过程也是 over-complication ,你注册了 IContextMenu ,但是没有使用任何 IContextMenu 的高级特性,而且你的 shell extension 只能在相合的 bitness 进程里加载。推荐的做法是注册 IDropTarget ,并且用 exe 实现 IDropTarget ,这样的优势:

    - IDropTarget 的实现比 IContextMenu 简单很多
    - 任何 bitness 的进程都可以访问你的 IDropTarget
    - 取消注册的时候,可以直接 kill 你的 IDropTarget 进程,进程隔离确保任何不受你控制的进程不会被破坏
    clow
        3
    clow  
    OP
       23 小时 44 分钟前 via Android
    @pigletfly 理论来说不可能比 rmx 快,目前 Windows 所有自己的工具和我见过的还有 msys2 等 Linux 仿真都不如 rmx 的实现激进,速度直观会快一倍有余
    clow
        4
    clow  
    OP
       23 小时 39 分钟前 via Android
    @geelaw 结束进程这里的实现是很激进,例如正常 office 软件打开了文件高级 api 好像会无法结束进程。注册 com api 这里没咋研究,这里主要是为了避开资源管理器的安全审查去强制删除一些文件,例如 nul
    clow
        5
    clow  
    OP
       23 小时 36 分钟前 via Android
    @geelaw 另外这个 删除 的概念我在考虑有没有必要去做 hook ,就像你说的不会进入回收站,目前为了性能比较激进,考虑 bug 问题没有去做这方面实现🙁
    subframe75361
        6
    subframe75361  
       23 小时 24 分钟前
    好像不支持通配符?比如 **/node_modules
    subframe75361
        7
    subframe75361  
       23 小时 23 分钟前
    另外 scoop 好评
    clow
        8
    clow  
    OP
       23 小时 23 分钟前 via Android
    @subframe75361 暂时不支持诶,等周一加上,可以提个 issue
    subframe75361
        9
    subframe75361  
       22 小时 57 分钟前
    @clow #8 已提
    xuejianxianzun
        10
    xuejianxianzun  
       22 小时 6 分钟前
    我删除 node_modules 为了加快速度也是在终端里删的,感觉也很快,没必要再装个命令行工具。而且直接杀进程的做法太激进了。
    busier
        11
    busier  
       21 小时 33 分钟前 via Android
    没必要

    Rd /s 足够
    clow
        12
    clow  
    OP
       21 小时 23 分钟前 via Android
    @xuejianxianzun 比终端的快一倍有余🤣至于杀进程属于附属的
    clow
        13
    clow  
    OP
       21 小时 17 分钟前 via Android
    @busier 但是右键不好用,每次开终端又不是必须的,看需求吧,我觉得某些情况下方便很多
    zhmouV2
        14
    zhmouV2  
       19 小时 37 分钟前
    我卑微前端删 node modules 一般都是用 vs code 打开项目的时候 所以直接走命令行了
    AoEiuV020JP
        15
    AoEiuV020JP  
       8 小时 55 分钟前
    这个提升,比想象中要小,有什么副作用没有,比如 explorer 不会自动刷新?
    clow
        16
    clow  
    OP
       8 小时 21 分钟前 via Android
    @AoEiuV020JP win 这个屎山不可能和 Linux 那种一样的,这还是不要回收站呢部分,不然速度直接无差别🙃,至于有没有 bug 这用了才知道,目前我自己遇到的都解决了
    clow
        17
    clow  
    OP
       8 小时 18 分钟前 via Android
    @zhmouV2 命令行也快哟,只是 ntfs 的问题无法做到和 Linux 一样秒删,但是快很多。直接 alias 设置个别名就一样的体验了
    meteora0tkvo
        18
    meteora0tkvo  
       8 小时 10 分钟前
    能够考虑下集成到 win11 新版菜单,因为现在很多人用的是 win11 系统
    clow
        19
    clow  
    OP
       7 小时 38 分钟前 via Android
    @meteora0tkvo 可以提个 issue ,明天改下
    her999
        20
    her999  
       1 小时 12 分钟前
    您开发这个软件,特点就是快。不过,有个小小的问题,就是用户真的需要吗?诚如您讲,在 Windows 的命令行状态下,删除 5300 多个文件,大约需要 1 秒钟多,而您的程序只需要 0.5 秒,快了 50%以上。问题是用户普遍在意这 0.5 秒的时间吗?
    一次性删除 5000 个以上文件,这样的操作,应该不用很常见的需求。即使偶有需求,那么也不大会有多少用户在于浪费了半秒的时间。
    clow
        21
    clow  
    OP
       49 分钟前 via Android
    @her999 几千个文件肯定不需要,需要的是几万或者更多,但正常用户一般确实用不到😫
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1926 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 11:50 · PVG 19:50 · LAX 03:50 · JFK 06:50
    ♥ Do have faith in what you're doing.