Форум: "Основная";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
ВнизУдаление без восстановления Найти похожие ветки
← →
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 вся ветка
Форум: "Основная";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.016 c