如何创建大小精确的文件
每个系统都有对应的命令,下面列出了全部三个。它们能给你一个字节数恰好正确的文件,对许多测试来说这就够了。本页的每条命令在发布前都在对应系统上运行过。
简短回答
Windows:fsutil file createnew name 10485760。Linux:dd if=/dev/zero of=name bs=1M
count=10。macOS:mkfile 10m name。大小以字节计,按文件管理器的算法,10 MB 就是 10485760 字节。
Windows
fsutil,以及无需额外工具的 PowerShell 写法
fsutil 随 Windows 提供。它接受以字节为单位的大小,所以先算出数字:10 MB 是 10485760,100 MB 是
104857600,1 GB 是 1073741824。
fsutil file createnew test10mb.bin 10485760
在 Windows 11 上实测:它可以在普通命令提示符下运行,不需要管理员权限,生成的文件恰好是 10485760 字节。
PowerShell 不需要调用其他程序也能做到同样的事,并且认识单位:
$file = New-Object System.IO.FileStream "test10mb.bin", Create, ReadWrite
$file.SetLength(10MB)
$file.Close()
PowerShell 中的 10MB 表示 10485760 字节,与资源管理器使用的 1024 进制算法相同,所以上面两条命令得到的大小一样。
Linux
dd、truncate 和 fallocate,以及容易坑人的差别
dd 是人人皆知的那个。它真的会写入这些字节:
dd if=/dev/zero of=test10mb.bin bs=1M count=10
truncate 是瞬间完成的,而这正是陷阱所在。在 Alpine Linux 上实测,该文件报告 10485760
字节,却占用零个块,它是一个稀疏文件。任何读取它的程序会得到十兆字节的零,但磁盘从未真正让出空间:
truncate -s 10M test10mb.bin
用它测试上传限制没问题,但用来测试磁盘配额就会误导人。当空间必须真实占用时,应该使用 fallocate:
fallocate -l 10M test10mb.bin
而当内容必须不可压缩,让归档程序无法再把它压小时:
head -c 10485760 /dev/urandom > test10mb.bin
macOS
mkfile(不是稀疏文件),以及你已经熟悉的另外两个
macOS 自带 mkfile。在 macOS 26.6.2 上实测:10485760 字节和 20480 个块,所以空间是真正分配的,而不只是承诺:
mkfile 10m test10mb.bin
dd 和 truncate 也都有,行为与 Linux 上相同:
dd if=/dev/zero of=test10mb.bin bs=1m count=10
truncate -s 10M test10mb.bin
这种办法在哪里失效
大小正确的文件不等于类型正确的文件
以上所有方法给你的都是一块零。如果被测对象只看大小,比如上传限制、配额或传输,这就够了。一旦有任何东西打开这个文件,就不够了。
实测过,而且值得你自己试一试:用 fsutil 做一个 2 MB 的文件,把它命名为 photo.png,再交给图像库处理。Pillow 会回答
cannot identify image file。它不是 PNG,从来就不是,只是名字这么说。
这比听起来更重要,因为测试随后会以哪种方式失败。你的上传接口拒绝了这个文件,测试变绿,于是你断定大小限制有效。其实它并不是因为大小而拒绝的,而是因为这些字节不是图片,你本想测试的规则根本没有被触及。
- 解析器在检查任何大小规则之前就拒绝了它
- 缩略图步骤失败,你读到的错误是关于缩略图的
- 杀毒软件或内容检查出于第三个原因拒绝了它
- 查看器什么也不显示,没人说得清这是不是那个 bug
另一种办法
该格式的真实文件,大小恰好是你要求的
这就是 Testing Files Generator 所做的事。文件是该格式的真实文件,能在对应软件中打开,字节数恰好等于你的要求,精确到字节:
tfg generate --format png --size 10mb --out ./fixtures
请求格式无法达到的大小,你会得到一个说明下限及其原因的错误,绝不会得到大小错误的文件。格式页面列出了每种格式及其能生成的最小文件。
而一个限制对应的是三个测试用例,而不是一个,所以工具会把三个都构建出来:
tfg generate --format pdf --boundary 10mb --out ./edges
这会给你 10485759、10485760 和 10485761 字节的文件,以及一份清单,说明你的系统应该接受哪些、拒绝哪些。使用场景页面会讲解这一点,以及它为之而生的另外四项任务。
免费开源,GPL-3.0。无需注册。Windows 和 macOS 的下载包已签名,启动时没有警告。
那么该用哪个?
-
使用系统命令
当没有任何东西会打开这个文件时。例如在先检查大小的接口上测试大小限制、传输、配额、磁盘写满的情况。只要一行,而且已经装好了。
-
使用真正的生成器
当有任何东西要解析、渲染、导入或解压这个文件时,以及当你明天要在另一台机器上拿到逐字节相同的 fixture 时。
两种办法都在本页,因为它们各自在一部分情况下是对的。要避免的错误,是在需要后者的地方用了前者,还把变绿的测试当成证明。