14

Как изменить размер файла из командной строки (или в пакетном файле)?

  • Он должен обрабатывать файл как двоичный файл. Формат файла не имеет значения и является произвольным.

  • Расширение файла должно дополнить его нулями.

  • Сжатие файла должно усечь файл.

Другими словами:

Как вы дублируете функциональность SetEndOfFile в командной строке?

4 ответа4

10

Я не верю, что эта функциональность изначально присутствует в оболочке DOS, я подозреваю, что вам нужно использовать другую программу, чтобы выполнить работу. Вот несколько возможностей:

  1. Существует инструмент под названием Trunc, который утверждает, что делает именно то, что вам нужно:

    Trunc - это приложение командной строки Windows для усечения файлов до указанного размера. Также можно увеличить файл.

    Вам нужно будет попробовать это, чтобы выяснить, как именно файл дополняется (например, с нулями или мусором), но в противном случае это, кажется, соответствует требованиям того, о чем вы просите.

  2. fsutil - системный инструмент для Windows XP и выше, обладающий некоторыми функциональными возможностями, которые могут помочь. В частности, подкоманда fsutil file может создавать, устанавливать длину, а также заполнять файлы нулями.

    В частности:

    fsutil file createnew "C:\temp\myfile" 1024

    Создает заполненный нулями файл размером 1024 байта, но я не вижу способа усечь файл. Существует команда, которая устанавливает допустимую длину данных, но она не изменяет маркер EOF следующим образом:

    Использование setvaliddata

    В NTFS существует два важных понятия длины файла: маркер конца файла (EOF) и допустимая длина данных (VDL). EOF указывает фактическую длину файла. VDL определяет длину допустимых данных на диске. Любые операции чтения между VDL и EOF автоматически возвращают 0, чтобы сохранить требование повторного использования объекта C2.

  3. UVHD - это шестнадцатеричный редактор, который, кажется, имеет функции, которые вы запрашиваете. Единственная проблема заключается в том, что он работает только под Windows/SFU (Services for Unix), а не под DOS. Что это на самом деле означает для конечного пользователя, я на самом деле не знаю, но у меня есть смутное подозрение, что SFU был отброшен в Vista и Win 7.

5
copy /Y nul: file.txt

Конечно, для установки только на 0 байтов.

2

Если у вас установлен GnuWin32, вы можете использовать dd для этого.

dd if=nul of=/the/file/to/truncate bs=1 count=0 seek=the_file_size oflag=append
2

попробуйте мою BSD усеченную сборку для Windows.

РЕДАКТИРОВАТЬ: он не работает с файлами> 2 ГБ.

Альтернативы, которые хорошо работают с большими файлами:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .