开头:MTP 批量导照片,最坑的就是掉速
用 Windows 把手机里的照片批量导到电脑,最方便的就是 MTP(媒体传输协议),插上线就能在资源管理器里看到手机。
但一旦要导几百上千张,就会遇到一个很诡异的现象:开头飞快,几十秒后突然掉到一分钟一张,卡到怀疑人生,最后只能手动一张张拖。
下面这套方案,是我们实测把几千张照片稳定导入后可以跑通的,核心思路只有一句话:爆发一批,掉速就重置会话,再爆发。
一、为什么 MTP 会掉速
MTP 不是把手机当磁盘挂上去,而是走 Windows Shell 的协议层。
当你一次性往里塞一大堆拷贝请求时,底层的 COM 会话会进入一种"假死"状态——表面上还在传,实际速率从几十张每分钟掉到 1 张每分钟。
有意思的是:只要你把相关进程杀掉、重新建立会话,又能恢复一阵高速。所以解决问题的关键,不是"更快的拷贝",而是"掉速就重置,循环榨取快窗口"。
二、核心代码:用 win32com 枚举手机并逐文件拷贝
Windows 自带的 Shell 对象能直接操作 MTP 设备,不需要装驱动。完整代码见下图。

要点:
NameSpace 的第 17 项就是"此电脑",手机作为便携设备挂在这里,不用装任何 ADB 驱动。
枚举走的是 COM 对象,不是文件路径,所以不要拿普通字符串路径去拼。
拷贝调用是异步的,触发之后不必等待,连续触发即可。
三、爆发 + 重置循环(这是关键)
单靠上面那段,拉几百张照样会掉速。要把它包成一个"监测速率、掉了就重置"的循环。

循环逻辑:
先动态枚举手机当天的实际文件数,作为总目标(不要写死数字)。
每轮拉一批(比如 50 张),监测速率。
一旦掉速,就终止卡住的会话、重新建立 COM 对象,进入下一轮爆发。
拉满为止。
实测下来,几千张照片能稳定保持在 100 张每分钟以上,比原生掉速态快了两个数量级。
四、几个必须处理的坑
断点续拉:按文件名判断已经拉过哪些,只拉缺失的。断了重来不会从头跑。
md5 去重:手机目录和备份目录都跑一遍哈希,避免同一张图重复落盘。
连续重编号:拉完把 raw 目录重排成 001 到 NNN 的连续序号,方便后续批处理。
路径里的冒号:有些命令会把路径里的冒号当成选项分隔符,枚举和拷贝都用对象而非字符串路径,能避开这个坑。
设备命名:不同品牌手机在"此电脑"里显示的不是盘符,而是设备名,枚举时按名称匹配,别写死盘符。
五、实测效果
一台安卓手机,一次导几千张照片:
原生资源管理器拖拽:几十秒后掉到约 1 张每分钟
爆发 + 重置循环:稳定 100 张每分钟以上
全程无需人工干预,断了也能续
结尾
MTP 掉速是 Windows 的老大难问题,但只要接受"爆发一批、掉速就重置会话、再爆发"的思路,批量导照片就不再是体力活。
如果你也经常要从手机往电脑搬大量照片或截图,这套循环值得一试。
附:本文涉及的关键调用速查

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。