片库里有 110 个视频打不开。点进去黑屏,或者干脆报「无法找到有效的媒体源」。
诡异的是:文件在云盘上好好躺着,大小分毫不差,扫描器也认得出来,连时长都刮到了。
空壳文件
把文件头读回来才看明白——内容全是零。大小是对的,字节是空的。
成因是某段网络受限的时期传上去的:上传中断后留下了预分配的空文件,大小写对了,数据没进去。
为什么校验没拦住
因为当时的「校验」只做了两件事:
- 数一数文件个数
- 比一比文件大小
这两项空壳文件全都能通过。
更糟的是 rclone 默认按「大小 + 修改时间」判断是否需要传输,所以重传时它会认为「目标已经一样了」,直接跳过——传了个寂寞。必须加 --ignore-times 强制覆盖。
改成什么样
现在每传完一个文件,都从云端读回前 12 个字节,验容器魔数:
h = subprocess.run(["rclone", "cat", "--count", "12", remote],
capture_output=True).stdout
ok = h[:4] == b"\x1a\x45\xdf\xa3" # mkv (EBML)
or h[4:8] == b"ftyp" # mp4
再比一次大小,两项都过才算数。
1000 多个文件跑下来多花不了几分钟,但从此再没出现过「看起来好好的、点开是坏的」。
校验必须查内容,不能只比大小。大小相同、修改时间相近的坏文件,是所有偷懒校验的盲区。
还有一件更要紧的事
有一次我跟人说「已经字节级校验过了」,其实只比了个数和大小。后来内容验下来确实没问题,但那句话在说出口的当下是没有根据的。
技术上的坑可以补,这种话说出去就收不回来了。没验过的事,别说成验过了。