Толик Панков
hex_laden
............ .................. ................

October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Толик Панков [userpic]
Создание файла нужного размера в Windows 7 и выше.

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

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/02/20/sozdanie-fajla-nuzhnogo-razmera-v-windows-7-i-vyshe/

Tags: ,
Comments
(Anonymous)

в линуксе файл с нулями любого размера делается очень быстро через truncate.

(Anonymous)

define проще?

dd (в заметке в самом начале пример).

(Anonymous)

Чем так извращённо ебаться, не проще ли воспользоваться dd и под виндой?

А где я тебе под виндой /dev/zero найду?
Мне интересно чтоб штатными средствами. Так-то и кугвин можно поставить.

(Anonymous)

От реализации же зависит. dd из mingw-w64 находит где-то.

Прикольно. А там не надо из-за dd весь mingw тащить?

(Anonymous)

Три dll-ки:
msys-2.0.dll
msys-iconv-2.dll
msys-intl-8.dll

Но понятно, что это не принципиально, можно в статике пересобрать же.

Хорошо. В этом блоге как-то был материал про dd под винды, но оно в /dev/zero вроде не умело. Но хорошее дополнение получилось, благодарю.