Обнуление файла из командной строки

960
Basj

Есть ли в Windows 7 или выше встроенная команда для заполнения файла нулевыми / NULL-байтами ?

Обработка должна происходить на месте (т.е. она должна изменять фактические сектора диска / байты файла), а не создавать новый файл.

Что-то вроде:

zero c:\temp\*.* 

или же

zero hello.bin 

что бы сделать это:

Before: hello.bin (500 MB) 5D 1A CB FF FF C0 ... AA CD 0F FF   After: hello.bin (500 MB) 00 00 00 00 00 00 ... 00 00 00 00 

Если для этого нет ничего встроенного, какие еще существуют решения? Или я должен был бы сделать это в C?

2
Можете ли вы пролить свет на то, почему вы хотите получить 500 МБ «00 00» вместо «FF FF» или безопасного удаления файла? Twisty Impersonator 7 лет назад 0
@TwistyImpersonator При использовании инструмента безопасного удаления мы не можем проверить, был ли он обнулен перед удалением с помощью wxHexEditor, потому что файл больше не существует (или нам нужно было бы запомнить сектор на диске и открыть весь диск с помощью wxHexEditor). Если файл просто обнулен и не удален, мы можем открыть и просмотреть его и проверить. Basj 7 лет назад 0
Я не уверен, что это действительно безопасно. Например, этот метод не звучит так, как будто он будет безопасно удалять любые данные файла, хранящиеся в MFT. Twisty Impersonator 7 лет назад 1

1 ответ на вопрос

5
DavidPostill

Есть ли в Windows встроенная команда для заполнения файла нулевыми / пустыми байтами?

Да. Вы можете использовать fsutilдля этого:

> fsutil file setzerodata /? Usage : fsutil file setzerodata offset=<val> length=<val> <filename> offset : File offset, the start of the range to set to zeroes length : Byte length of the zeroed range Eg : fsutil file setzerodata offset=100 length=150 C:\Temp\sample.txt 

Чтобы обнулить заполнение всего файла, вам нужно использовать смещение 0и вам нужно знать длину файла.


Можем ли мы использовать пакетный файл, который автоматически вычислит размер?

Конечно.

Используйте следующий пакетный файл (zero.cmd):

@echo off setlocal enabledelayedexpansion for %%a in (%1) do ( fsutil file setzerodata offset=0 length=%%~za %%a ) endlocal 

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

  • Вы можете передать одно имя файла в качестве аргумента: zero test.txtили подстановочный знак:zero *.txt

Пример:

> type test.txt abc foo$ foo bar  > zero test.txt Zero data is changed  > type test.txt  > 


Дальнейшее чтение

Благодарю. Можем ли мы сделать пакет, который будет работать примерно так: `ноль myfile.bin`, т.е. который будет автоматически вычислять размер? Basj 7 лет назад 0
Спасибо @DavidPostill, с пакетом это замечательно, так как он принимает подстановочные знаки `* .txt`! Небольшая вещь (не так уж сложно, если это невозможно, просто спросить, если это возможно, если в пакете есть еще одна или две строки): будет ли это работать рекурсивно для всех файлов в подпапках? Как `zero -rc: \ temp \` будет обнулять все файлы в этой папке или в ее подпапках. Basj 7 лет назад 0
... И последнее: действительно ли `fsutil setzerodata` на 100% безопасен? т.е. нет ли риска, что он * выделит новые сектора * на диске для записи нулевых байтов и оставит предыдущие данные еще где-нибудь на диске? ;) Документально подтверждено, что он заменяет нулевые байты ** на месте **? Basj 7 лет назад 0
@Basj Я не знаю, полностью ли это безопасно :) DavidPostill 7 лет назад 0
@Basj `zero -rc: \ temp` можно сделать, но для этого потребуется более сложный пакетный файл (параметры синтаксического анализа и т. Д.). Это не то, на что я хотел бы потратить время, чтобы понять это правильно. DavidPostill 7 лет назад 0
Спасибо за ваш ответ @DavidPostill. Это уже идеально, как сейчас (я только что спросил это в случае, если рекурсивный subdir мог быть добавлен с помощью всего лишь нескольких символов в пакете, как, например, добавление флага `-r` в цикле` for`, но так как это невозможно , не нужно тратить на это больше времени, это уже хорошо!) Basj 7 лет назад 0