К сожалению, в C # и в C / C ++ это не совсем возможно, даже если вы пишете драйвер режима ядра.
Цитата из документации Bleachbit:
Измельчение отдельного файла должным образом предполагает, что его местоположение может быть полностью известно, но в основном это может быть известно только в одном идеальном случае. Идеальный вариант имеет три характеристики:
- Размер файла никогда не уменьшался из-за редактирования. Представьте, что вы начинаете с электронной таблицы размером 3 МБ, редактируете ее до 1 МБ (с помощью приложения для работы с электронными таблицами) и просите чистое приложение: удалить версию 1 МБ: очиститель не может знать, где на физическом жестком диске было выделено недостающие 2 МБ. (Помните: файловые системы часто не хранят файлы непрерывно, поэтому вы не можете предполагать, что отсутствующая часть была непосредственно после известной части.)
- Файл никогда не перемещался. Представьте, что электронная таблица сохраняет документ, записывая новую копию во временный файл, удаляя старую копию и переименовывая временный файл в исходный. название. В этом случае приложение-уборщик не может узнать, где находилась какая-либо старая таблица.
- Файловая система перезаписывает файлы в одно и то же место. Это хорошее предположение. В Windows NTFS и Linux наиболее распространенная конфигурация ext3 (которая используется по умолчанию в Ubuntu 9.10 и других дистрибутивах Linux) перезаписывает файлы в одном и том же месте, но прозрачное сжатие диска, шифрование и разреженные файлы могут не перезаписывать файлы на месте.
Далее: Когда область современного жесткого диска повреждена, он автоматически перераспределяет поврежденный сектор на резервный. Эти операции выполняются по усмотрению встроенного программного обеспечения привода, и ни операционная система, ни приложения не знают о перемещении, поэтому при очистке диска игнорируется поврежденная область.
Сказав это, можно (хотя и не просто) выяснить, в каких секторах диска находится файл , который в настоящее время занимает . Однако для этого необходимо, чтобы ваше приложение (хотя бы частично) понимало используемую файловую систему и то, как эта файловая система хранит файлы на базовом носителе.
Наконец, остается вопрос, какую дополнительную безопасность вы бы получили, идентифицировав все сектора, которые занимает ваш файл, и заполнив их нулями по сравнению с просто выполнением
using(var fs = new System.IO.FileStream(@"m:\delme.zip",
FileMode.Open,
FileAccess.Write,
FileShare.None))
{
var zeros = new byte[fs.Length];
fs.Write(zeros, 0, zeros.Length);
}