“FTP 那个‘跳过相同文件’是不是默认开着?我传个包慢得要死,等半天。”

老大在群里甩来这么一句。同样的选项 SFTP 那边也有,他用着挺快,以为 FTP 顶多差一点,没想到差出一条街。

先说这功能是干嘛的。七亿批量远程管理工具的文件窗口里有个「跳过相同文件(MD5)」,设置里的键叫 SkipSameByMd5,默认开着。逻辑很简单:传某个文件之前,先算它的 MD5,跟远端同名文件比一下,一样就跳过不传。

SFTP 这边算远端 MD5 很轻松——它本来就走 SSH 通道,另开一条命令跑个 md5sum 就出来了,秒回。

FTP 不行。FTP 协议里根本没有“让服务器算个 MD5 给我”这种通用命令:DELE 有、SIZE 有、取时间戳的 MDTM 也有,就是没有算哈希的。所以在 FTP 下这个功能只能退一步——把远端那个文件整个下载回来,本地算完 MD5,再跟待传文件比。文件越大这一趟越亏,慢,还实打实跑流量。

我一开始还以为是宝塔那边不支持,后来才搞明白跟服务器一点关系没有,是协议本身就缺这条命令,换谁家的 FTP 都一样。

顺带修了两个显示上的 bug,都是在这个“下载回来比对”的过程里冒出来的。

一个是速度。FTP 的传输速度取的是「已传字节 ÷ 耗时」,而原来的耗时是从任务一开始就起算的。可任务开头那几秒它全在干比对,一个字节都没往上送。等真正开始传的时候,分母已经被比对的时间撑大了,速度显示出来就接近 0,看着像卡住。SFTP 没这毛病,它是从真正开始传数据那一刻才起算的。照它改。

另一个是进度条。命中“跳过相同文件”的时候,代码还是把进度往前推了一格——可它压根没传东西。两头一叠,就出现“速度 0、进度却在走”的怪画面。改成跳过的项不推进度,跟 SFTP 对齐。

还补了句状态栏文案,比对时显示 🔍 正在比对(MD5,需下载远端) i/n: 文件名。以前这一步是纯静默的,用户在界面上看到的就是“点了上传没反应”,其实它正在闷头下载。

提示框也加了说明。SameFileAsk.Show3 多了个可选的 note 参数,传了就在按钮上方显示一行橙色小字:FTP 服务器不支持在线算 MD5,选「MD5 相同跳过」得把远端文件下回本地再比,较慢、会耗流量。SFTP 不传这段——它走 md5sum,秒算,对话框维持原样。

要不要干脆在 FTP 下把这个开关默认关掉?没关。跳过相同文件对重复上传是真省事,只是第一次比的时候慢。知道它慢在哪、慢多少,用户自己权衡就行,替他把功能砍了反而是帮倒忙。

具体怎么用、比对方式怎么选,七亿批量远程管理工具的说明书里都有;之前那篇 FTP 窗口里那句会删本地文件的命令,也是同一个窗口里翻出来的坑。