В Linux создать файл нужного размера не просто, а чрезвычайно просто. Есть утилита dd
и устройство /dev/zero
, которое отгрузит вам нужное количество символов с кодом 0
.
Например, создадим файл размером 20 Мб:
dd if=/dev/zero of=file.zero bs=20M count=1
В винде (7 и выше) появилась утилита fsutil
, способная сделать аналогичную операцию:
fsutil file createnew <filepath> <size>
где:
<filepath>
— путь к файлу
<size>
— размер файла в байтах
Правда, у этой утилиты есть 2 неудобных момента:
1. Она хочет права администратора, и с этим ничего не поделать штатными средствами, но можно, например поделать моей утилитой wsudo (копия)
2. Надо указывать размер файла в байтах, что не очень удобно. А вот с этим вполне можно бороться, написав батник-обертку, который будет обрабатывать еще один параметр — модификатор единиц измерения (килобайты или мегабайты), вычислять нужное значение в байтах и вызывать fsutil
.
1. Проверяем параметры CMD-файла:
@echo off if "%~1" EQU "" ( echo No arguments. Use "%~n0%~x0 <filename> <size> [K|M]" exit /b 1 )
символ ~
удаляет кавычки из переменной %1
(первый аргумент командной строки CMD/BAT файла), if
сравнивает значение переменной в кавычках с пустыми кавычками. Если первого аргумента нет, выводится соответствующее сообщение и скрипт завершает работу с кодом возврата 1 (exit /b 1
)
2. Выводим справку по использованию CMD-файла:
if "%~1" EQU "/?" ( echo Use "%~n0%~x0 <filename> <size> [K|M]" exit /b 1 )
В переменной %0
хранится путь к самому CMD-файлу, конструкция %~n0
обрезает полный путь до имени файла (без расширения), а %~x0
— оставляет одно расширение (с начальной точкой). Конструкции %~n<номер>
и %~x<номер>
можно использовать только с аргументами командной строки.
Запуск CMD-файла без параметров:
zerofile.cmd
No arguments. Use "zerofile.cmd <filename> <size> [K|M]"
и с параметром вывода справки:
zerofile.cmd /?
Use "zerofile.cmd <filename> <size> [K|M]"
3. Теперь проверим, указан ли в имени файла путь к нему, если не указан — добавим к имени файла текущий каталог:
if "%~1" EQU "%~n1%~x1" ( set FILENAME=%CD%\%~1 ) else ( set FILENAME=%~1 )
Если имя файла (первый параметр) равно этому же имени и расширению, значит, путь не указан, в качестве пути добавляем текущий каталог, и записываем его в переменную FILENAME
.
4. Установим удобные имена переменных для остальных параметров — размера файла и единицы измерения:
set FILESIZE=%~2
set ED=%~3
5. Теперь надо проверить, является ли размер файла целым положительным числом.
Штатных проверок в языке CMD/BAT файлов не предусмотрено, но можно пойти на хитрость. Известно, что команда set
способна делать арифметические действия над числами и переменными (надо установить ключ /a
и написать выражение в кавычках). Если в переменной встретится не число, то set
автоматически будет считать значение переменной равным 0
. Соответственно, в результате получится значение с учетом этого. Значит достаточно сделать с переменной какое-то действие, которое не приведет к изменению значения (например, отнять и прибавить единицу), а потом проверить, получился ли положительный результат.
set /a "RES=FILESIZE+1-1" if %RES% LEQ 0 ( echo Can't create file with size %RES% exit /b 2 )
6. Проверяем, какая единица измерения установлена в 3 параметре CMD-файла. Если в качестве параметра установлена K(k)
— килобайты, M(m)
— мегабайты. Что-то еще или ничего — размер файла задается в байтах.
if "%ED%" EQU "K" goto :kb
if "%ED%" EQU "M" goto :mb
if "%ED%" EQU "k" goto :kb
if "%ED%" EQU "m" goto :mb
goto :create
7. Вычисляем размер файла в байтах:
:kb set /a "RES=FILESIZE*1024" set ST=%FILESIZE% Kb goto :create :mb set /a "RES=FILESIZE*1024*1024" set ST=%FILESIZE% Mb
8. Выводим summary и создаем файл нужного размера:
:create echo Creating file: %FILENAME% if "%ST%" EQU "" ( echo Size: %RES% bytes ) else ( echo Size: %ST% [%RES% bytes] ) wsudo fsutil file createnew "%FILENAME%" %RES%
CMD-файл целиком (на GitHub)
CMD-файл целиком (на PasteBin)
wsudo
(с GitHub)
1. Фишки батников (Копия в PDF)
2. CMD/BAT — Проверка наличия параметров (Копия в PDF)