Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление без восстановления [D7, WinXP]


Страницы:   1 2

Destroyer ©   (2005-12-10 01:21:00) 

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


kaZaNoVa   (2006-02-06 07:00:00) [1]

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

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


kaZaNoVa   (2006-02-06 06:58:00) [2]

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


Германн   (2006-02-06 04:12:00) [3]


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


:))))


FRAEROK   (2006-02-06 02:43:00) [4]

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


Zeqfreed   (2005-12-18 13:06:00) [5]

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


Zeqfreed   (2005-12-18 13:05:00) [6]

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


Джо   (2005-12-18 03:47:00) [7]


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

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


Германн   (2005-12-18 03:41:00) [8]


> 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 01:02:00) [9]


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

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

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


Destroyer   (2005-12-18 00:48:00) [10]

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


Destroyer   (2005-12-18 00:16:00) [11]

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


Zeqfreed   (2005-12-18 00:11:00) [12]

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;


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


Zeqfreed   (2005-12-18 00:03:00) [13]

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;


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


palva   (2005-12-17 23:32:00) [14]

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


Destroyer   (2005-12-17 14:55:00) [15]

Теперь проблема в том, чтобы правильно полностью записать открытый фаил мусором. Делаю так:
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 мб, никакой оперативной памяти нехватит.
Помогите плз решить эти проблемы.


Джо   (2005-12-15 00:53:00) [16]

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


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


Destroyer   (2005-12-15 00:31:00) [17]

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


Джо   (2005-12-14 02:01:00) [18]

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


ANB   (2005-12-14 01:14:00) [19]


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

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


Destroyer   (2005-12-14 00:29:00) [20]

А на АПИ не быстрее выйдет?
Пытаюсь так но неполучается. Не пишет в фаил + ошибка при закрытиии хэндла.
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;

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо