Cheb писал(а):Не знаю, честно, как эта кухня устроена, но навевает.
Вообще-то программа полного уничтожения сначала определяет местонахождение всех секторов файла, а потом посекторно затирает используя прямой доступ к файловой системе.
Модератор: Модераторы
Cheb писал(а):Не знаю, честно, как эта кухня устроена, но навевает.
C:\Documents and Settings\Admin>del /?
Удаление одного или нескольких файлов.
DEL [/P] [/F] [/S] [/Q] [/A[[:]атрибуты]] имена
ERASE [/P] [/F] [/S] [/Q] [/A[[:]атрибуты]] имена
имена Имена одного или нескольких файлов. Для удаления сразу
нескольких файлов используются подстановочные знаки.
Если указан каталог, из него будут удалены все файлы.
/P Запрос на подтверждение перед удалением каждого файла.
/F Принудительное удаление файлов, доступных только для чтения.
/S Удаление указанных файлов из всех подкаталогов.
/Q Отключение запроса на подтверждение при удалении файлов.
/A Отбор файлов для удаления по атрибутам.
атрибуты S Системные файлы R Доступные только для чтения
H Скрытые файлы A Файлы для архивирования
Префикс "-" имеет значение НЕ
Изменение команд DEL и ERASE при включении расширенной обработки команд:
Результаты вывода для ключа /S принимают обратный характер, то есть выводятся
только имена удаленных файлов, а не файлов, которые не удалось найти.
Оптимизнёт что-нить - бац - и старый файл остался в свободных секторах.
Лекс Айрин писал(а):Osmiy, скорее всего, путаете с удалением минуя корзину... впрочем, это можно легко проверить.
Osmiy писал(а): Я имею ввиду функцию встроенную в файловую систему, которая занимается затиранием удаленного файла.
Osmiy писал(а): Подобная функция по умолчанию работает с оперативной памятью.
ShellExecute(Handle,'open', 'C:\Windows\System32\cipher.exe','/w:G:\Tmp', nil, SW_SHOWNORMAL);
// Затерание файла на диске (без удаления).
procedure TForm1.EraseFileDisk(Path: String);
var
bf: File of Byte;
n: Longint;
z: Integer;
M: array[1..256] of Byte;
begin
for z:=1 to 256 do M[z]:=0;
try
n:=FileSize(UTF8ToWinCP(Path));
AssignFile(bf,Path);
Reset(bf);
while n>1 do begin
if n>255 then z:=256
else z:=n;
BlockWrite(bf,M[1],z);
n:=n-z;
end;
finally
CloseFile(bf);
// Sleep(300);
end;
end;
EraseFileDisk(Sf);
DeleteFile(PChar(UTF8ToWinCP(Sf)));
shyub писал(а):Вероятнее всего она затирает весь диск и, возможно, к вечеру сотрёт и заданную папку.
shyub писал(а):Запустил вот так:
- Код: Выделить всё
ShellExecute(Handle,'open', 'C:\Windows\System32\cipher.exe','/w:G:\Tmp', nil, SW_SHOWNORMAL);
G: - 4-х гиговая флэшка (меньше не нашёл), затираемая папка G:\Tmp - 48 КБ. Вот уже минут 15 она стирает мне эту папку, но пока папка на месте. Вероятнее всего она затирает весь диск и, возможно, к вечеру сотрёт и заданную папку. Вариант может и стоящий, но для использовании в составе программы не пригодный.
Попробовал вот так:
- Код: Выделить всё
// Затерание файла на диске (без удаления).
procedure TForm1.EraseFileDisk(Path: String);
var
bf: File of Byte;
n: Longint;
z: Integer;
M: array[1..256] of Byte;
begin
for z:=1 to 256 do M[z]:=0;
try
n:=FileSize(UTF8ToWinCP(Path));
AssignFile(bf,Path);
Reset(bf);
while n>1 do begin
if n>255 then z:=256
else z:=n;
BlockWrite(bf,M[1],z);
n:=n-z;
end;
finally
CloseFile(bf);
// Sleep(300);
end;
end;
Но почему-то:
1. Если после этой ф-ции идёт удаление файла:
- Код: Выделить всё
EraseFileDisk(Sf);
DeleteFile(PChar(UTF8ToWinCP(Sf)));
То все данные на диске остаются. Ставил задержку 0.3 сек - не спасла.
2. Если затираю блоком, равным размеру файла, то остаётся много "хвостов". При размере блока в 256 байт результат лучше, но некоторые "куски" файла, которые разбросаны по диску, остаются.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4