![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление без восстановления [D7, WinXP]
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;
В чем тут проблема?