C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Удаление файла...
YanMinsk
Отправлено: 13.09.2004, 16:25


Не зарегистрирован







DeleteFile насколько я понял удаляет файл, а как удалить файл, да еще и его заголовок в FAT.
Guest
Отправлено: 13.09.2004, 16:47


Не зарегистрирован







А почему это вас беспокоит ?
DeleteFile удаляет описание из списка заголовков (так назывемом Directory) и помечает кластеры как не используемые в File Allocation Tatble (таблице распределения кластеров) (в обоих копиях). Так что можете не переживать — просто вызывайте DeleteFile.
Konstantine
Отправлено: 13.09.2004, 17:10


Мастер участка

Группа: Модератор
Сообщений: 545



и даже не так!!! при удалении, в имени файла в каталоге первый символ заменяется на определённый (вроде-бы 0E5h)... и так и существует в каталоге.
FAT — это таблица чисел (номеров кластеров), которая хранит номер след.кластера в цепочке. При обычном удалении эта цепочка не меняется. Меняется только ссылка на файл в каталоге.
Для физического удаления файл надо переписать. напр. нулями. причём объёмом не еньшим чем исхдный файл.
Для того чтоб гарантированно убрать запись из каталога каталог надо пересоздать. или переименовать файл и его удалить.

FAT — не содержит никаких заголовков. Если что не понял — объясни конкретнее суть проблемы, и может быть поможем.
YanMinsk
Отправлено: 14.09.2004, 15:03


Не зарегистрирован







Смысл в том (как я понимаю) в FAT хранится название файла, цепочка кластеров и т.д. Так вот есть файл- его надо удалить так чтобы его нельзя было восстановить разными утилями и вообще продвинутый user smile.gif не смог определить что етот файл был. Для решения первой задачи этот файл несколько раз забиваем нулями/ еденицами/бредом, а вот как в FATе все о нем удалить???
Guest
Отправлено: 14.09.2004, 15:15


Не зарегистрирован







Воспользоваться коммерческим утилитом. Например из поставки нортона.
Konstantine
Отправлено: 14.09.2004, 15:37


Мастер участка

Группа: Модератор
Сообщений: 545



QUOTE (YanMinsk @ 14/09/2004, 16:05)
Смысл в том (как я понимаю) в FAT хранится название файла, цепочка кластеров и т.д.
...
а вот как в FATе все о нем удалить???

FAT не хранит этих данных. Это хранит каталог... и не спорь. это так!!!
Даже если так. каким тебе нада подходом? чтоб ТЫ это сделал? или твоя программа без участия тебя?
Если достаточно того чтоб ТЫ удалил — пользуйся после удаления дефрагментацией. или утилями разными, имеющие низкий уровень. чем ниже — тем лучше.
Если программно — то это очень опасная штука — можно враз вообще всё повалить... и тут без прямого доступа к железу не обойтися... нада хотя-бы считывание-запись по секторам (кластерам) и полное знание устройства файловой системы (тут с NTFS посложнее).

напиши ещё конкретнее подход. программный или пользовательский?
Хлор
Отправлено: 14.09.2004, 18:09


Дежурный стрелочник

Группа: Участник
Сообщений: 78



File Shredder — Программа для безвозвратного затирания файлов.
YanMinsk
Отправлено: 14.09.2004, 21:02


Не зарегистрирован







Именно програмно, и без использования вского рода утилит. А насчет того , что хранится в FAT пусть будет так как Вы все говорите (мне в принципе все равно), главное — как мне это удалить??????
YanMinsk
Отправлено: 14.09.2004, 21:09


Не зарегистрирован







И еще если Вы говорите, что это опасно и сложно, то как действуют эти самые пресловутые утилиты??? Или задам вопрос по другому: — Как сделать так, чтобы о файле, который я удалил, ничего не было известно тем же самым утилитам по восстановлению данных(типа Norton, EasyRecovery и т.д.)
Konstantine
  Отправлено: 15.09.2004, 09:09


Мастер участка

Группа: Модератор
Сообщений: 545



даа это самое худшее что Я ожидал. надеюсь хоть система (здесь и далее — файловая система) — FAT.
Теперь: это надо делать под win? или можно под DOS? т.к. под ВИН-ом боюсь сложно будет получить прямой доступ к диску...

дальше буду рассказывать подробно но без примеров кода, т.к. сам этого не писАл и не пробовал, но теоретически это знаю. Все испытания рекомендую проводить на RAM диске, желательно имеющем систему FAT32. или на жестком диске (разделе) не имеющем ценной информации. Таже можно проводить отладку и испытания на Virtual PC — это будет ещё безопаснее.

теперь о системе, для удаления (безвозратного) надо:
1) найти соотв. запись в каталогах. для этого надо осуществуть поиск по каталогам, известно что:
а) номер кластера с которого начинается корневой каталог можно получить из BR (boot record — загрузочная запись — первый сектор раздела)
б) в каталоге ищем запись с именем следующего каталога, и переходим в след. каталог (№ кластера указан в структуре записи) — так повторять пока не дойдём до файла. — здесь проблема — каталог может быть фрагментирован — т.е. каталог может располагаться не в одном кластере и не в подряд идущем. Номер след. кластера можно получить из FAT.
в) в каталоге с файлом аналогично находим кластер с которого начинается файл.
2) пройдя по всей цепочке в таблице FAT обнулить все её значения в цепочке. (каждый элемент таблицы содержит номер (индекс) след. элемента в цепочке, конец цепочки — значение от -1 до -8 в hex виде)). тут эе можно обнулять информацию в кластерах с данными. Также нужно учесть что таблиц может быть не одна и не две... их количество записано в BR
3) вернутся к каталогу. Все записи которые следуют дальше текущей, сместить на 1 ранее (нельзя просто обнулить запись) — и текущая запись перепишется.

ну вот основные принципы и стратегия.

Теперь остаётся под вопросом проблемы:
1) чтение произвольного кластера раздела диска
2) запись в произвольный кластер раздела диска
3) уверенность в том что на диске отсутствуют логические ошибки.

Если решишь эти проблемы — то Я тебе помогу далее с реализацией. токо пообещай, что если получится — поделишься исходниками.
Konstantine
Отправлено: 15.09.2004, 09:22


Мастер участка

Группа: Модератор
Сообщений: 545



P.S.: Для NTFS я не знаю...
Guest
Отправлено: 15.09.2004, 10:05


Не зарегистрирован







Открываете файл
Узнаете его размер
Становитесь на начало
Записываете размер_файла байт со значением, например, FF
Закрываете
Переименовываете файл во что то не важное
Удаляете
Все

И, ради бога, не лазьте по FAT. На FAT32 нули в цепочке проставит DeleteFile. А если это не FAT то последствия непредсказуемые.
Кстати, Win даст вам по рукам при попытке залезть в FAT следовательно работать придется только под DOS (не эмуляция а именно стартовая загрузка).
Konstantine
Отправлено: 15.09.2004, 10:53


Мастер участка

Группа: Модератор
Сообщений: 545



фат сразу не обнуляется (но неуверен), но тут проблема в том, что вообще скрыть запись из каталога!!!
Guest
Отправлено: 15.09.2004, 11:09


Не зарегистрирован







QUOTE
проблема в том, что вообще скрыть запись из каталога

Ну и пусть восстановят файл с непонятным именем и содержимым из одних FF smile.gif
Konstantine
Отправлено: 15.09.2004, 11:23


Мастер участка

Группа: Модератор
Сообщений: 545



Это неполное решение проблемы... в рде случаев это вызывает подозрение и т.д.
Хотя давай подождём что YanMinsk скажет...
YanMinsk
Отправлено: 15.09.2004, 21:33


Не зарегистрирован







Да..... Весело.....
Проблема в том, что надо под Windows причем, какая файловая система заранее не известно (FAT, FAT32 или NTFS). Надо подумать, стоит ли ломать копья или воспользоваться советом Guest-а. Короче завтра в командировку, в понедельник объявлюсь, может, что и придумаем. Пишите у кого какие мысли возникнут.
Konstantine
Отправлено: 16.09.2004, 08:02


Мастер участка

Группа: Модератор
Сообщений: 545



Если стоит, то для NTFS нада отдельныйй модуль строить... FAT12, FAT16 и FAT32 можно объединить в один. но опять таки винда не даст записать сектор, для Win9x можно конечно VxD написать...
AVC
Отправлено: 16.09.2004, 08:09


Ветеран

Группа: Модератор
Сообщений: 1583



Это опять я.
Или перезаписывайте или берите промышленный чистильщик, включите в комплект поставки и вызывайте из свего приложения.
Иначе вам придется рассматривать случаи когда файлы нужно убирать с файл-серверов на Novell, Linux или чем то еще.

Отредактировано AVC — 16/09/2004, 08:19
Konstantine
Отправлено: 16.09.2004, 09:44


Мастер участка

Группа: Модератор
Сообщений: 545



Кстати, полезно почитать http://www.lowlevel.ru/articles/filesystems_read.htm
Boyko
Отправлено: 17.09.2004, 11:37


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (Guest @ 15/09/2004, 11:07)
Открываете файл
Узнаете его размер
Становитесь на начало
Записываете размер_файла байт со значением, например, FF
Закрываете
Переименовываете файл во что то не важное
Удаляете
Все


Я давно писал но еще ползуюсь

CODE

void MyDeleteFile(AnsiString fileName, int myRecLen)
{
int fileLength, myHandle, recordsNumber;
char wipe[4]={0x00,0xFE,0xFF,0xBF};
char *wipeRecord = new char[myRecLen];
try
{
 myHandle = FileOpen(fileName, fmOpenRead);
 if (myHandle>-1) {
  fileLength = FileSeek(myHandle,0,2);
  recordsNumber=fileLength/myRecLen;
  FileClose(myHandle);
  for (int i=0; i<sizeof(wipe); ++i) {
   myHandle = FileOpen(fileName, fmOpenReadWrite);
   memset(wipeRecord,wipe[i],myRecLen);
   for (int j=0; j<recordsNumber; ++j)
    FileWrite(myHandle,wipeRecord,myRecLen);
   FileClose(myHandle);
  }
  DeleteFile(fileName);
  myHandle = FileCreate(fileName);
  FileClose(myHandle);
  DeleteFile(fileName);
 }
 delete [] wipeRecord;
 return;
}
catch(...)
{
                            ...
 return;
}
}
YanMinsk
Отправлено: 20.09.2004, 09:55


Не зарегистрирован







Приветствую!
Я подумал и решил не мудрить, хотя, конечно надо было-бы сделать по уму, но я решил сделать так:
Открываем файл
Записываем в него всякую ерунду
Усекаеам размер до нуля(при этом в FAT-е будет остутствовать ссылка на следующий кластер ранее занимаемый файлом, то есть цепочка будет разорвана.)
Переименовываем
Удаляем
Ну вот наверное и все. Всем спасибо.
AVC
  Отправлено: 20.09.2004, 10:13


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Усекаеам размер до нуля(при этом в FAT-е будет остутствовать ссылка на следующий кластер ранее занимаемый файлом, то есть цепочка будет разорвана.)

Вам советовали — не забивайте голову FAT.
Для справки. Цепочку разрушает (обнуляет) delete. Алгоритм восстановления выглядит так — в каталоге по следам файла находим стартовый кластер, и размер. Если файл меньше кластера 100% восстановление (или не восстановление), иначе ищем по FAT следующие нулевые кластары до заполнения длины файла.
Выводы делайте сами.
Konstantine
Отправлено: 20.09.2004, 11:48


Мастер участка

Группа: Модератор
Сообщений: 545



Какой вопрос.....
Чел хотел в FAT полезть... Я и рассказал что к чему там. Рассказал какие проблемы при этом возникают... и ОН принял правильное (для себя) решение.

Вернуться в Вопросы программирования в C++Builder