Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.014 c
2-1140570136
Bogdan1024
2006-02-22 04:02
2006.03.12
Скомандовать виндовс открыть файл.


2-1140888361
Gydvin
2006-02-25 20:26
2006.03.12
Объединение строк в ASM


15-1140431069
Ega23
2006-02-20 13:24
2006.03.12
Чукча - чум


2-1140711503
K_Lock
2006-02-23 19:18
2006.03.12
Ошибка......


15-1139984335
Vlad Oshin
2006-02-15 09:18
2006.03.12
Как поставить Windows на комп, если:





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский