Как получить физическое местоположение файла на жестком диске - PullRequest
4 голосов
/ 10 января 2012

Я хочу создать файл-шедер, чтобы полностью удалить файл, записав нули в его физические области.

Файлы могут храниться на жестком диске по частям, но не всегда целиком.

Когда я говорю физические зоны. Я имею в виду физические разделы, в которых хранится файл, или любую ссылку на те разделы, которые я могу выполнить «написание нулей».

Лучше в C #.

Ответы [ 3 ]

6 голосов
/ 10 января 2012

К сожалению, в C # и в C / C ++ это не совсем возможно, даже если вы пишете драйвер режима ядра.

Цитата из документации Bleachbit:

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

  1. Размер файла никогда не уменьшался из-за редактирования. Представьте, что вы начинаете с электронной таблицы размером 3 МБ, редактируете ее до 1 МБ (с помощью приложения для работы с электронными таблицами) и просите чистое приложение: удалить версию 1 МБ: очиститель не может знать, где на физическом жестком диске было выделено недостающие 2 МБ. (Помните: файловые системы часто не хранят файлы непрерывно, поэтому вы не можете предполагать, что отсутствующая часть была непосредственно после известной части.)
  2. Файл никогда не перемещался. Представьте, что электронная таблица сохраняет документ, записывая новую копию во временный файл, удаляя старую копию и переименовывая временный файл в исходный. название. В этом случае приложение-уборщик не может узнать, где находилась какая-либо старая таблица.
  3. Файловая система перезаписывает файлы в одно и то же место. Это хорошее предположение. В 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);       
}
1 голос
/ 10 января 2012

Как правило, .NET API для этого не существует.Скорее всего, вы смотрите на ручное чтение структур FS с диска и разбор структур размещения файлов и использование взаимодействия для перехода к низкоуровневому блочному вводу-выводу.

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

Кроме того, рассмотрим случай, когда файл, который вы пытаетеськрошка была перераспределена ОС недавно.Некоторые из областей, которые использовались файлом, теперь помечены как «пустые», но данные все еще там.Нет (почти) способа выяснить, что это за области / где они есть, без «измельчения» всего диска.

Кроме того, для параноиков среди нас: запись нулей (или единиц, или мусора) в файлобластей НЕ гарантирует, что старые данные станут невосстановимыми.Физическое уничтожение диска может помочь, но API для этого не существует;)

0 голосов
/ 10 января 2012

Я не уверен, что вы можете сделать это.Согласно This , для этого можно использовать только неуправляемый код.

...