rmx:给 Windows 换一个能用的删除 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
clow

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

  •  
  •   clow 2 月 7 日 3057 次点击
    这是一个创建于 75 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

    25 条回复    2026-02-13 09:15:37 +08:00
    pigletfly
        1
    pigletfly  
       2 月 7 日
    和 robcopy 相比呢?
    geelaw
        2
    geelaw  
       2 月 7 日   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
       2 月 7 日 via Android
    @pigletfly 理论来说不可能比 rmx 快,目前 Windows 所有自己的工具和我见过的还有 msys2 等 Linux 仿真都不如 rmx 的实现激进,速度直观会快一倍有余
    clow
        4
    clow  
    OP
       2 月 7 日 via Android
    @geelaw 结束进程这里的实现是很激进,例如正常 office 软件打开了文件高级 api 好像会无法结束进程。注册 com api 这里没咋研究,这里主要是为了避开资源管理器的安全审查去强制删除一些文件,例如 nul
    clow
        5
    clow  
    OP
       2 月 7 日 via Android
    @geelaw 另外这个 删除 的概念我在考虑有没有必要去做 hook ,就像你说的不会进入回收站,目前为了性能比较激进,考虑 bug 问题没有去做这方面实现
    subframe75361
        6
    subframe75361  
       2 月 7 日
    好像不支持通配符?比如 **/node_modules
    subframe75361
        7
    subframe75361  
       2 月 7 日
    另外 scoop 好评
    clow
        8
    clow  
    OP
       2 月 7 日 via Android
    @subframe75361 暂时不支持诶,等周一加上,可以提个 issue
    subframe75361
        9
    subframe75361  
       2 月 7 日
    @clow #8 已提
    xuejianxianzun
        10
    xuejianxianzun  
       2 月 7 日
    我删除 node_modules 为了加快速度也是在终端里删的,感觉也很快,没必要再装个命令行工具。而且直接杀进程的做法太激进了。
    busier
        11
    busier  
       2 月 7 日 via Android
    没必要

    Rd /s 足够
    clow
        12
    clow  
    OP
       2 月 7 日 via Android
    @xuejianxianzun 比终端的快一倍有余至于杀进程属于附属的
    clow
        13
    clow  
    OP
       2 月 7 日 via Android
    @busier 但是右键不好用,每次开终端又不是必须的,看需求吧,我觉得某些情况下方便很多
    zhmouV2
        14
    zhmouV2  
       2 月 8 日
    我卑微前端删 node modules 一般都是用 vs code 打开项目的时候 所以直接走命令行了
    AoEiuV020JP
        15
    AoEiuV020JP  
       2 月 8 日
    这个提升,比想象中要小,有什么副作用没有,比如 explorer 不会自动刷新?
    clow
        16
    clow  
    OP
       2 月 8 日 via Android
    @AoEiuV020JP win 这个屎山不可能和 Linux 那种一样的,这还是不要回收站呢部分,不然速度直接无差别,至于有没有 bug 这用了才知道,目前我自己遇到的都解决了
    clow
        17
    clow  
    OP
       2 月 8 日 via Android
    @zhmouV2 命令行也快哟,只是 ntfs 的问题无法做到和 Linux 一样秒删,但是快很多。直接 alias 设置个别名就一样的体验了
    meteora0tkvo
        18
    meteora0tkvo  
       2 月 8 日
    能够考虑下集成到 win11 新版菜单,因为现在很多人用的是 win11 系统
    clow
        19
    clow  
    OP
       2 月 8 日 via Android
    @meteora0tkvo 可以提个 issue ,明天改下
    her999
        20
    her999  
       2 月 8 日
    您开发这个软件,特点就是快。不过,有个小小的问题,就是用户真的需要吗?诚如您讲,在 Windows 的命令行状态下,删除 5300 多个文件,大约需要 1 秒钟多,而您的程序只需要 0.5 秒,快了 50%以上。问题是用户普遍在意这 0.5 秒的时间吗?
    一次性删除 5000 个以上文件,这样的操作,应该不用很常见的需求。即使偶有需求,那么也不大会有多少用户在于浪费了半秒的时间。
    clow
        21
    clow  
    OP
       2 月 8 日 via Android
    @her999 几千个文件肯定不需要,需要的是几万或者更多,但正常用户一般确实用不到
    Charon2050
        22
    Charon2050  
       2 月 8 日   1
    感谢!用来删不知道被什么进程占用的零碎文件非常有用
    metalvest
        23
    metalvest  
       2 月 8 日 via Android
    steam 删游戏就是瞬间删除的
    clow
        24
    clow  
    OP
       2 月 8 日 via Android
    @metalvest 自己调研下为什么秒删
    iorilu
        25
    iorilu  
       2 月 13 日
    不错啊, 有时候删不掉, 说被占用确实很麻烦

    试试看
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2091 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 74ms UTC 00:01 PVG 08:01 LAX 17:01 JFK 20:01
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86