Вниз
Скачать: CL | DM;

Удаление без восстановления   Найти похожие ветки 

← →
Destroyer ©   (2005-12-10 01:21) [0]

Нужно удалалять файлы и папки так, чтобы их невозможно было восстановить. Например как это делает shredder из комплекта антивируса McAfee. По идее надо удалить фаил или папку и перезаписать на его место что-нибудь еще и желательно несколько раз. Как это сделать? Или это еще как-то делается?


← →
jack128 ©   (2005-12-10 01:29) [1]

Открыть файл, записать по всей его длине мусор(можно несколько раз). После этого удалить.


← →
Германн ©   (2005-12-10 01:43) [2]


>  По идее надо удалить фаил или папку и перезаписать на его
> место что-нибудь еще

Если действительно "по идее", то как jack128 ©   (10.12.05 01:29) [1]
То бишь "утром деньги, вечером стулья. Но деньги вперед!"


← →
Джо ©   (2005-12-10 02:55) [3]

Кажется, к  [1] jack128 © имеет смысл добавить то, что перед окончательным удалением, файлу лучше дать другое имя, т.е., переименовать. Таким образом нельзя будет увидеть даже истинные имена удаленных файлов.


← →
Destroyer ©   (2005-12-11 02:04) [4]

Спасибо, буду пробовать.


← →
TUser ©   (2005-12-11 11:29) [5]

1. Создать объект FileSystem. Там есть метод DeleteFile с соотв. параметром - поместить ли в корзину или насовсем.
2. И вот это
If pFrom is set to a file name, deleting the file with FO_DELETE will not move it to the Recycle Bin, even if the FOF_ALLOWUNDO flag is set. You must use a full path.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/structures/shfileopstr uct.asp


← →
Destroyer ©   (2005-12-11 20:26) [6]

А причем тут корзина? Я спрашивал про восстановление разными методами и программами уже после удаления из корзины.


← →
Destroyer ©   (2005-12-13 23:48) [7]

Такая проблема. Если удалять фаил размером 10 мб, то это ооочень долго. Подскажите плз, как ускорить процесс. Делаю так:
procedure Shredder(delfile:string);
var
f: file of Byte;
i:integer;
rubbish:Byte;
begin
assignfile(f,delfile);
reset(f);
rubbish:=$EB;
for i:=1 to FileSize(f) do
begin
 write(f,rubbish);
end;
closefile(f);


← →
ANB ©   (2005-12-14 00:11) [8]


> Destroyer ©   (13.12.05 23:48) [7]

Так конечно, долго.
1. Используй прямые функции доступа (через хендл)
2. Пиши кусками побольше.


← →
Destroyer ©   (2005-12-14 00:29) [9]

А на АПИ не быстрее выйдет?
Пытаюсь так но неполучается. Не пишет в фаил + ошибка при закрытиии хэндла.
var
buf                :Byte;
numOfBytesToWrite  :dword;
bytesWritten       :dword;
filehandle         :integer;
begin
buf:=$eb;
numOfBytesToWrite:=sizeof(buf);

CreateFile("c:\test\1.txt",GENERIC_WRITE,FILE_SHARE_WRITE,nil,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH,filehandle);
showmessage(inttostr(filehandle));
WriteFile(filehandle,buf,numOfBytesToWrite,bytesWritten,nil);
showmessage(inttostr(bytesWritten));
closehandle(filehandle);
end;

В чем тут проблема?


← →
ANB ©   (2005-12-14 01:14) [10]


> Destroyer ©   (14.12.05 00:29) [9]

FileOpen - просто обертка над АПИ функциями. Скорость практически та же, а ошибок меньше. Тебе она хендл то вернула ?


← →
Джо ©   (2005-12-14 02:01) [11]

Да не пиши ты по байту, что за безобразие?


← →
Destroyer ©   (2005-12-15 00:31) [12]

Хорошо, подскажите как писать по десяткам байт плз. Ведь переменная rubbish типа Byte, какой тип можно взять, чтобы писать больше? dword всего 4 байта, а как больше?


← →
Джо ©   (2005-12-15 00:53) [13]

type
 TRubbish = array [0..4096] of Byte;
var
 Rubbish: TRubbish;
 AFile: File;
...
 BlockWrite (AFile, Rubbish[0], SizeOf(Rubbish));
....


Или используй TFileStream;


← →
Destroyer ©   (2005-12-17 14:55) [14]

Теперь проблема в том, чтобы правильно полностью записать открытый фаил мусором. Делаю так:
type
TRubbish = array [0..4096] of Byte;
// TRubbish = array of Byte;

var
f: file;
i:integer;
Rubbish:TRubbish;
begin

{$I-}

assignfile(f,delfile);
reset(f);

//setlength(Rubbish,FileSize(f));

{
for i:=1 to SizeOf(Rubbish) do
begin
  Rubbish[i]:=$EB;
end;
}

for i:=1 to FileSize(f) do
begin
BlockWrite (f, Rubbish[0], SizeOf(Rubbish));
end;

closefile(f);
{$I+}

end;

Тут так:
1)Надо как можно быстрее записать весь фаил. Если писать блоками, например по 4 кб, то в конце все-таки блок несовпадет - ошибка.
2)Еще: если неставить {I-} и {I+}, то при записи блока ЛЮБОГО размера (даже много меньше самого размера файла) выскакивает ошибка доступа 1784. А если ставить, то всё проходит без ошибок, но в фаил ничего не пишется.
Если писать сразу весь фаил одним блоком, предварительно задав размер динамическому массиву, то если фаил 100 мб, никакой оперативной памяти нехватит.
Помогите плз решить эти проблемы.


← →
palva ©   (2005-12-17 23:32) [15]

> Если писать блоками, например по 4 кб, то в конце все-таки блок несовпадет - ошибка.
А почему ошибка? Файл должен увеличить свой размер. А потом можно анализировать длину и писать последний блок нужного размера (третий параметр BlockWrite)


← →
Zeqfreed ©   (2005-12-18 00:03) [16]

Destroyer ©   (17.12.05 14:55) [14]

function FillFileWithTwos(const FileName : String; UpdateProgress : TUpdateProgressCallback) : Boolean;

function _UpdateProgress(const BytesWritten : Int64) : Boolean;
begin
 if Assigned(UpdateProgress) then
  Result := UpdateProgress(BytesWritten)
 else
  Result := true;
end;

var
buf : array[1..4096] of Byte;
fs : TFileStream;
written : Int64;
begin
Result := false;

FillChar(buf, SizeOf(buf), $02);
fs := TFileStream.Create(FileName, fmOpenWrite);
try
 written := 0;

 if (fs.Size >= SizeOf(buf)) then
  repeat
   written := written + fs.Write(buf, SizeOf(buf));
  until (fs.Size - written < SizeOf(buf)) or not _UpdateProgress(written);

 if (fs.Size - written > 0) then
  written := written + fs.Write(buf, fs.Size - written);

 Result := _UpdateProgress(written) and (written = fs.Size);
finally
 fs.Free();
end;
end;


Посмотри, может найдешь что-нибудь интересное для себя :)
Вроде, код с задачей справляется ;)


← →
Zeqfreed ©   (2005-12-18 00:11) [17]

Zeqfreed ©   (18.12.05 0:03) [16]
Наверное, лучше так будет организовать:

function FillFileWithTwos(const FileName : String; UpdateProgress : TUpdateProgressCallback) : Boolean;
var
 buf : array[1..4096] of Byte;
 fs : TFileStream;
 written : Int64;
 goon : Boolean;
begin
 Result := false;

 FillChar(buf, SizeOf(buf), $65);
 fs := TFileStream.Create(FileName, fmOpenWrite);
 try
  written := 0;

  if (fs.Size >= SizeOf(buf)) then
   repeat
    written := written + fs.Write(buf, SizeOf(buf));

    if Assigned(UpdateProgress) then
     goon := UpdateProgress(written)
    else
     goon := true;

    if not goon then Exit;
   until (fs.Size - written < SizeOf(buf));

  if (fs.Size - written > 0) then
   written := written + fs.Write(buf, fs.Size - written);

  if Assigned(UpdateProgress) then
   goon := UpdateProgress(written)
  else
   goon := true;

  Result := goon and (written = fs.Size);
 finally
  fs.Free();
 end;
end;


А то предыдущий код не совсем корректно себя повел бы в некоторых ситуациях :)


← →
Destroyer ©   (2005-12-18 00:16) [18]

Спасибо. Буду пробовать.


← →
Destroyer ©   (2005-12-18 00:48) [19]

Здорово, работает, спасибо. Но пробовал без UpdateProgress, т.к. не смог найти нужный модуль. Где его взять? И, если можно, синтаксис вызова этой функции с UpdateProgress.
Заранее спасибо.


← →
Джо ©   (2005-12-18 01:02) [20]


>  [19] Destroyer ©   (18.12.05 00:48)

Объяви процедуру такого образца:
type
 TUpdateProgressCallback = procedure (Written: Integer);

procedure MyProgressProc (Written: Integer);
begin
 ....
end;
Ее адрес и передавай в FillFileWithTwos.


← →
Германн ©   (2005-12-18 03:41) [21]


> Destroyer ©   (18.12.05 00:48) [19]
>
> Здорово, работает, спасибо. Но пробовал без UpdateProgress,
>  т.к. не смог найти нужный модуль. Где его взять? И, если
> можно, синтаксис вызова этой функции с UpdateProgress.
> Заранее спасибо.
> <Цитата>
> Джо ©   (18.12.05 01:02) [20]
>
>
> >  [19] Destroyer ©   (18.12.05 00:48)
>
> Объяви процедуру такого образца:
> type
>  TUpdateProgressCallback = procedure (Written: Integer);
>
>
> procedure MyProgressProc (Written: Integer);
> begin
>  ....
> end;
> Ее адрес и передавай в FillFileWithTwos.


И как в Голливудских фильмах будем наблюдать "ползущую" строку "данные" передаются, уничтожаются и т.д. и т.п.


← →
Джо ©   (2005-12-18 03:47) [22]


> [21] Германн ©   (18.12.05 03:41)

Честно говоря, не понял. Видимо, я много выпил сегодня.
Кстати, что эта ветка делает в WinAPI? ;0)


← →
Zeqfreed ©   (2005-12-18 13:05) [23]

Destroyer ©   (18.12.05 0:48) [19]
Нужно сделать почти, как написал Джо в [20] ;)
Только UpdateProgress должна быть функцией, возращающей true если операцию следует продолжить и false, если её необходимо прервать.


← →
Zeqfreed ©   (2005-12-18 13:06) [24]

Zeqfreed ©   (18.12.05 13:05) [23]
И единственный параметр лучше сделать типа Int64.


← →
FRAEROK   (2006-02-06 02:43) [25]

Мне тоже заказали разработать такую программу и вней должно быть реализовано удление файлов без востановления ..писал я скажу вам около 3 недель ну вообще все программу просто там надобыло и чтоб блокировал Altctrl del а это под ХР не так просто оказываеться и чтоб убивало запущенные программы короче много всего.
И вот что я посматрел на ваши методы и знаете что?они небудут работать под NTFS под FAT32 отлично будут пахать а вот с НТФС проблемка я сам долго мучался


← →
Германн ©   (2006-02-06 04:12) [26]


> FRAEROK   (06.02.06 02:43) [25]
>
> Мне тоже заказали разработать такую программу и вней должно
> быть реализовано удление файлов без востановления ..писал
> я скажу вам около 3 недель ну вообще все программу просто
> там надобыло и чтоб блокировал Altctrl del а это под ХР
> не так просто оказываеться и чтоб убивало запущенные программы
> короче много всего.
> И вот что я посматрел на ваши методы и знаете что?они небудут
> работать под NTFS под FAT32 отлично будут пахать а вот с
> НТФС проблемка я сам долго мучался


:))))


← →
kaZaNoVa ©   (2006-02-06 06:58) [27]

проблема решена? :)


← →
kaZaNoVa ©   (2006-02-06 07:00) [28]

FRAEROK   (06.02.06 2:43) [25]
и чтоб блокировал Altctrl del а это под ХР не так просто оказываеться

проще ...  чем говорят .. пример есть в кладовке



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.52 MB
Время: 0.025 c
1-1139473306
nastya
2006-02-09 11:21
2006.03.12
Не видно MainMenu в форме


3-1137399113
Васяня
2006-01-16 11:11
2006.03.12
Определение существания таблицы


2-1140438880
Рафик
2006-02-20 15:34
2006.03.12
ntext


2-1140788428
Golik
2006-02-24 16:40
2006.03.12
Сортировка в DBGride ??


1-1139390282
nastya
2006-02-08 12:18
2006.03.12
вставить нестандартный символ




   Наверх