В 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)