片库里有 110 个视频打不开。点进去黑屏,或者干脆报「无法找到有效的媒体源」。

诡异的是:文件在云盘上好好躺着,大小分毫不差,扫描器也认得出来,连时长都刮到了。

空壳文件

把文件头读回来才看明白——内容全是零。大小是对的,字节是空的。

成因是某段网络受限的时期传上去的:上传中断后留下了预分配的空文件,大小写对了,数据没进去。

为什么校验没拦住

因为当时的「校验」只做了两件事:

  1. 数一数文件个数
  2. 比一比文件大小

这两项空壳文件全都能通过

更糟的是 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 多个文件跑下来多花不了几分钟,但从此再没出现过「看起来好好的、点开是坏的」。

校验必须查内容,不能只比大小。大小相同、修改时间相近的坏文件,是所有偷懒校验的盲区。

还有一件更要紧的事

有一次我跟人说「已经字节级校验过了」,其实只比了个数和大小。后来内容验下来确实没问题,但那句话在说出口的当下是没有根据的

技术上的坑可以补,这种话说出去就收不回来了。没验过的事,别说成验过了。