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 байт результат лучше, но некоторые "куски" файла, которые разбросаны по диску, остаются.

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1