Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2009, 09:58   #1
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
Вопрос Наполнение файла мусором (перед удалением) Delphi

Доброго времени суток !

Написал вот такую функцию ...

Идея : для "безвозвратного" удаления файлов записать в файл всякий бред изменить размер , а уже потом удалять его с диска любым способом.

С небьольшим логом :
Код:
function Erase(FileName:string;{BytesCount,}Cycles:integer=1):TStringList;
var
  f:TFileStream;
  rub:array[1..1024] of Byte;
  i,j,cc:integer;
  res:TStringList;
  chas,min,sec,msec:Word;
  begin
  cc:=0;
  res :=TStringList.Create;
  DecodeTime(GetTime,chas,min,sec,msec);
  res.Add(IntToStr(chas)+':'+IntToStr(min)+':'+IntToStr(sec)+':'+IntToStr(msec));// 0 - начало
  res.Add(IntToStr(Cycles));// 1 - колво проходов

  if FileExists(FileName)
  then f:=TFileStream.Create(FileName,fmOpenWrite+fmshareexclusive)
  else begin res.Add('0');   res.Add(IntToStr(chas)+':'+IntToStr(min)+':'+IntToStr(sec)+':'+IntToStr(msec)); result:=res; Exit; end;
  for  j := 1 to Cycles do
  begin
   f.Position := 0;
   while f.Position < f.Size do
   begin
   for i:=1 to Length(rub) do rub[i] := Random(256);//тут какбы сам мусор генерируется ... :)
   Inc(cc);
   f.Write(rub,SizeOf(rub));
   end;
  end;
  res.Add(IntToStr(cc));// 2 - циклов
  DecodeTime(GetTime,chas,min,sec,msec);
  res.Add(IntToStr(chas)+':'+IntToStr(min)+':'+IntToStr(sec)+':'+IntToStr(msec));// 3 - окончание
  result:=res;
  f.Free;
end;
//Убрал связь с внешним миром исключая result
Добавить строчку deletefile не проблема)

+off
В кабинете шефа компьютерщик подготавливает комп к форматированию. В это время в кабинет влетает секретарша:
- Шеф спрашивает, не встречалась ли вам папка "Мусор"?
Компьютерщик с ужасом вспоминает, что минуту тому назад снес эту папку. Немедленно запускаются всевозможные "анерейзы", и через полчаса он гордо докладывает вешедшему в кабинет шефу:
- Шеф, я нашел ее!
- Кого?
- Ту папку, "Мусор". Вы полчаса назад звонили...
- Ах да! Я хотел сказать - сотри ее нафиг...

Последний раз редактировалось Lime; 09.10.2009 в 10:08.
Lime вне форума Ответить с цитированием
Старый 09.10.2009, 10:31   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,848
По умолчанию

Тут есть вопрос или это типа демо примера?
Немного мудрёно написано. Проще в исходный файл записать нули, количество = размеру файла, т.е. полностью затереть, а, затем, удалить.
Т.е. совсем не обязательно туда писать мусор. А несколько проходов вообще не ясно, для чего? После первого же прохода там ничего не останется от исходных данных. А так только тормозить процесс это будет.
Arigato вне форума Ответить с цитированием
Старый 09.10.2009, 10:32   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не сильно понял что тее надо, но предложу свой любимый способ какаь в файл мусора:
Код:
  var f:file of byte;
  s:string;i:integer;
begin
 assignFile(f,'C:\temp\i');
 reset(f);
 i:=FileSize(f);
 SetLength(s,i);
 for i:=1 to length(s) do s[i]:=char(random(255));
 BlockWrite(f,s[1],length(s));
 CloseFile(f);
  { TODO -oUser -cConsole Main : Insert code here }
end.
Способ не идеальный но работает хорошо и быстро.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2009, 10:37   #4
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
Радость

Цитата:
Сообщение от Arigato Посмотреть сообщение
Тут есть вопрос или это типа демо примера?
Немного мудрёно написано. Проще в исходный файл записать нули, количество = размеру файла, т.е. полностью затереть, а, затем, удалить.
Т.е. совсем не обязательно туда писать мусор. А несколько проходов вообще не ясно, для чего? После первого же прохода там ничего не останется от исходных данных. А так только тормозить процесс это будет.
Да это чтото вроде демо. Ну я так подумал не нужно особенно умудрятся чтобы этот самый мусор придумать)

Посоветовали сделать 2-3 прохода , по причине "на винчестере остаётся намагничивание" , я не особеннно вникал в возможность этого , как я понимаю действительно после 1вого прохода намагничивание старого сожержания должно заменится на новое.

Ещё советовали записать рандомные значения , авось файлик восстановят после протстого deletefile файл должен быть к этому моменту обезличен ) не восстановим.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не сильно понял что тее надо, но предложу свой любимый способ какаь в файл мусора:
Код:
  var f:file of byte;
  s:string;i:integer;
begin
 assignFile(f,'C:\temp\i');
 reset(f);
 i:=FileSize(f);
 SetLength(s,i);
 for i:=1 to length(s) do s[i]:=char(random(255));
 BlockWrite(f,s[1],length(s));
 CloseFile(f);
  { TODO -oUser -cConsole Main : Insert code here }
end.
Способ не идеальный но работает хорошо и быстро.
Файл может быть любого типа ( но изначально предполагается - программа под windows).

Хотелось сделать быстродействие - пробовал 2мя способами.
Делал лог примерно таково содержания :
Цитата:
array[1..1024*1] - 7,6 кб/сек на тестовом файлике //140msec цикл
array[1..1024*2] - 11,2 // 170msec
array[1..1024*4] - 24 // 175msec
array[1..1024*8] - 38 // 207msec
array[1..1024*16] - 59 // 275msec
Решил сделать х4 х8 ...

Так-же пробовал задавать длинну массива в аргументах
{BytesCount,}Cycles:integer
Но SetLength(rub,BytesCount); както неверно работало ... Length(rub) =4..

Лучшим способом было бы автоопределение какими блоками писать , в зависмости от размера файла ) загвоздка только в переопределении размера массива ...

add:
тест
Код:
var
  a:array of Byte;
  i:Integer;
begin
SetLength(a,1000);

ShowMessage(IntToStr(Length(a)));
 for i:=1 to Length(a) do a[i] := Random(256);
ShowMessage(IntToStr(Length(a)));
Показал обратное ... странно )

Последний раз редактировалось Stilet; 09.10.2009 в 11:02.
Lime вне форума Ответить с цитированием
Старый 09.10.2009, 11:03   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
както неверно работало
А че у меня все работает? Что я не так делаю?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2009, 11:07   #6
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
Подмигивание

Цитата:
Сообщение от Stilet Посмотреть сообщение
А че у меня все работает? Что я не так делаю?
У меня делфи волшебная) особенно Code Gear

Код аналогичный тому что был выше в тесте вчера(на ночь глядя) отказывался работать ... задавал длинну массива стабильно - 4 и процедура даже для маленьково файла длилась очень долго) записывалось блоками по 4 байта)

Сейчас на свежую тыкву напишу заново)

add:
Код:
function EraseFile(Filename:string):Integer;
var
fs:TFileStream;
i:Integer;
m:array of Byte;
begin
if not FileExists(Filename) then begin Result := 2; Exit; end;
fs := TFileStream.Create(Filename,fmOpenWrite);
case fs.Size of
0..1024*16 : SetLength(m,1024);
1024*16+1..1024*500 : SetLength(m,1024*8);
1024*500+1..1024*1024*32 : SetLength(m,1024*16);
else
SetLength(m,1024*16);
fs.Position := 0;
while fs.Position < fs.Size do
 begin
 for i := 0 to Length(m) do m[i] := Random(256);
 fs.Write(m,SizeOf(m));
 end;
fs.Free;
end;
if DeleteFile(Filename) then result := 1 else  result := 0;
end;
Возвращает 0 ...( наверно окрываю/закрываю неверно ...

Последний раз редактировалось Lime; 09.10.2009 в 11:46.
Lime вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить размер файла перед скачиванием. kalexi Работа с сетью в Delphi 12 17.02.2012 18:17
ПОМОГИТЕ с удалением малыша Софт 3 15.07.2009 23:43
Проблема с удалением файлов. Dj_smart Общие вопросы Delphi 4 22.03.2008 12:32
TreeView2.Items.Item[j+1].text забито мусором, а должен быть текст AlDelta Общие вопросы Delphi 1 07.09.2007 16:37
Ошибка с удалением pr1de БД в Delphi 1 08.05.2007 03:44