link3266 link3267 link3268 link3269 link3270 link3271 link3272 link3273 link3274 link3275 link3276 link3277 link3278 link3279 link3280 link3281 link3282 link3283 link3284 link3285 link3286 link3287 link3288 link3289 link3290 link3291 link3292 link3293 link3294 link3295 link3296 link3297 link3298 link3299 link3300 link3301 link3302 link3303 link3304 link3305 link3306 link3307 link3308 link3309 link3310 link3311 link3312 link3313 link3314 link3315 link3316 link3317 link3318 link3319 link3320 link3321 link3322 link3323 link3324 link3325 link3326 link3327 link3328 link3329 link3330 link3331 link3332 link3333 link3334 link3335 link3336 link3337 link3338 link3339 link3340 link3341 link3342 link3343 link3344 link3345 link3346 link3347 link3348 link3349 link3350 link3351 link3352 link3353 link3354 link3355 link3356 link3357 link3358 link3359 link3360 link3361 link3362 link3363 link3364 link3365 link3366 link3367 link3368 link3369 link3370 link3371 link3372 link3373 link3374 link3375 link3376 link3377 link3378 link3379 link3380 link3381 link3382 link3383 link3384 link3385 link3386 link3387 link3388 link3389 link3390 link3391 link3392 link3393 link3394 link3395 link3396 link3397 link3398 link3399 link3400 link3401 link3402 link3403 link3404 link3405 link3406 link3407
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