Лично я думаю, что необходимо отметить столбцы как Пустой указатель или не пустые на основе того, какие данные они содержат, если существует подлинное требование для данных, чтобы всегда быть там, и известны ли данные всегда во время входа. Отмечание столбца как не пустой, когда у пользователей нет данных, вызовет затем для составления данных, которые делают все данные бесполезными (это, как Вы заканчиваете с данными спама, такими как почтовое поле, содержащее "thisissilly@Ihatethisaplication.com"). При отказе потребовать чего-то, что должно быть там, чтобы процесс работал (говорят, что поле ключа для показа, что клиент сделал порядком) одинаково глупо. Пустой недостаток, не пустой, является проблемой целостности данных в основе, сделайте то, что имеет большую часть смысла к хранению Ваших применимых данных.
AFAIK, это довольно сложный процесс. Вы не можете просто использовать CreateFile и перечислить «удаленные файлы». Вы должны загрузить главную файловую таблицу диска и перечислить ее для файлов, помеченных как удаленные, а затем попытаться загрузить данные из позиции на диске, указанной в MFT. Для этого потребуется много кода, вызываемого платформой, и, возможно, несколько переопределений собственных структур данных в C #.
Краткий ответ на ваш вопрос:
CreateFile("\\\\.\\PhysicalDrive0",
GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
0,
OPEN_EXISTING,
0,
NULL)
Вы используете команду create file, чтобы открыть сам диск.
Вот действительно хорошая статья обо всем процессе над Code Project. Но все это на С ++. Код есть, и кажется, вы знаете, как p \ invoke, так что перенос его не должен быть проблемой.
Редактировать:
Тот факт, что диск является внешним, не должен усложнять задачу, вы все равно можете открыть диск тем же способом, который я показал (возможно, используйте инструмент WMI , чтобы найти путь после подключения диска). Затем вы можете использовать информацию на странице Википедии для FAT32 , чтобы определить структуры данных, в которые вы можете читать MFT и другие части файловой системы. Как только вы попадете туда, вы просто перебираете 32-байтовые определения файлов в таблице каталогов, глядя на первый байт:
0xE5 Entry has been previously erased and is available. File undelete utilities must replace this character with a regular character as part of the undeletion process.
Я не уверен, что вы имеете в виду, исследуя удаленные каталоги, но вы сможете получить дескриптор каталога, передав FILE_FLAG_BACKUP_SEMANTICS
отметьте в CreateFile
и , указав OPEN_EXISTING
для настройки создания. Из статьи MSDN о CreateFile :
Чтобы открыть каталог с помощью CreateFile, укажите
FILE_FLAG_BACKUP_SEMANTICS
flag как часть dwFlagsAndAttributes. Соответствующие проверки безопасности еще применяется, когда этот флаг используется безSE_BACKUP_NAME
иSE_RESTORE_NAME
привилегии.
Похоже, вы уже пробовали что-то из этого, но прокомментировали? Если это не сработает для вас, вы можете убедиться, что этот пользователь, от имени которого вы работаете, имеет разрешение на доступ к рассматриваемому каталогу.
Просто чтобы предложить вам другой подход, в случае, если он уместен, вы всегда можете просто посмотреть каталог с помощью FileSystemWatcher и поймать событие Deleted
. Конечно, вам нужно будет смотреть его во время удаления, но это может быть гораздо более простое решение, чем попытка восстановить его (если это возможно).