Як створити файл точного розміру
У кожній системі для цього є команда, і всі три наведено нижче. Вони дають файл із точною кількістю байтів, а для багатьох тестів цього досить. Кожну команду на цій сторінці було виконано до публікації у тій системі, до якої вона належить.
Коротка відповідь
Windows: fsutil file createnew name 10485760. Linux: dd if=/dev/zero of=name
bs=1M count=10. macOS: mkfile 10m name. Розміри вказуються в байтах, а 10
МБ, пораховані так, як рахує ваш файловий менеджер, - це 10485760.
Windows
fsutil і варіант на PowerShell, якому не потрібно нічого додаткового
fsutil входить до Windows. Він приймає розмір у байтах, тому спершу
порахуйте число: 10 МБ - це 10485760, 100 МБ - 104857600, 1 ГБ - 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()
10MB у PowerShell означає 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
Де це перестає працювати
Файл правильного розміру - не файл правильного виду
Усе сказане вище дає блок нулів. Цього досить, коли тестоване дивиться лише на розмір: ліміт завантаження, квота, передача. Цього перестає вистачати, щойно щось відкриває файл.
Виміряно, і варто перевірити самому: зробіть файл на 2 МБ командою fsutil, назвіть його
photo.png і передайте бібліотеці роботи із зображеннями. Pillow відповість
cannot identify image file. Це не PNG. Він ним ніколи й не був, так казало лише
ім'я.
Це важливіше, ніж здається, через те, в який бік тест тоді провалюється. Ваша точка завантаження відхиляє файл, ваш тест зеленіє, і ви робите висновок, що ліміт розміру працює. Вона відхилила його не через розмір. Вона відхилила його тому, що байти не були зображенням, і правило, яке ви хотіли перевірити, так і не було досягнуте.
- парсер відхиляє його, не дійшовши до жодних правил розміру
- крок створення мініатюри падає, і помилка, яку ви читаєте, стосується мініатюри
- антивірус чи перевірка вмісту відхиляє його з третьої причини
- переглядач нічого не показує, і ніхто не може сказати, чи в цьому помилка
Інший шлях
Справжній файл цього формату точно того розміру, який ви запросили
Саме це робить 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 підписані та запускаються без попереджень.
Тож що використовувати?
-
Використовуйте системну команду
Коли ніщо не відкриває файл. Перевірка ліміту розміру на точці, що спершу дивиться розмір, передача, квота, переповнення диска. Це один рядок, і він уже встановлений.
-
Використовуйте справжній генератор
Коли будь-що розбирає, відображає, імпортує чи розпаковує файл - і коли завтра на іншій машині потрібні ті самі фікстури, байт у байт.
Обидві є на цій сторінці, бо обидві бувають слушними. Помилка, якої слід уникати, - використати першу там, де потрібна друга, і сприйняти зелений тест за доказ.