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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2012, 14:42   #11
Aristarh Dark
Форумчанин
 
Регистрация: 07.08.2007
Сообщений: 154
По умолчанию

Цитата:
Сообщение от MORPEH Посмотреть сообщение
А как тогда в примере то что выше так же сделать. Что-то не понимаю. Как тогда будет выглядеть?
Код:
...
f.Position:=0;
while f.Position<>f.Size do
begin
//зачем чтение не понял, поэтому "закоментарил".
//n:=f.Position;
//f.ReadBuffer(buffer,1);
//f.Position:=n;
buffer[1]:=$92;
buffer[2]:=$49;
buffer[3]:=$24;
f.WriteBuffer(buffer,3);
end;
...
Aristarh Dark вне форума Ответить с цитированием
Старый 10.07.2012, 15:04   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от MORPEH
А как тогда в примере то что выше так же сделать. Что-то не понимаю. Как тогда будет выглядеть?
Aristarh Dark, если размер файла не кратен трём, то после вашего кода в него добавятся лишние байты..

я бы рекомендовал примерно такой код:
Код:
implementation

{$R *.dfm}

procedure WriteByteValueToFile(var f : TFileStream;
                isRandom : boolean; BytesValue : array of byte);
var
   n : int64;
   i, b, k : byte;
begin
  f.Position:=0;
  if isRandom then  begin
    for i:=1 to f.Size do begin
       b := Random(BytesValue[ Low(BytesValue) ]+1);
       f.WriteBuffer(b, 1);
     end
  end
  else begin
    k := Low(BytesValue);
    for i:=1 to f.Size do begin
        b := BytesValue[ k ];
        f.WriteBuffer(b, 1);
        inc(k);
        if k>High(BytesValue) then k := Low(BytesValue);
    end;
 end;
end; {конец процедуры}


procedure TForm1.Button1Click(Sender: TObject);
var
  f:TFileStream;
  fname : string;
begin
   randomize;
   if Not Opendialog1.Execute then Exit;

   fname:=Opendialog1.FileName;            
   if not fileexists(fname) then begin
     ShowMessage('Нет файла '+fname+' - значит, нечего тут делать!');
     Exit;
   end;

   try
     f:=TFileStream.Create(fname,fmOpenReadWrite);

      // пишем случайное число от 0 до 255
     WriteByteValueToFile( f, True, [255] );

      // пишем число 0x55
     WriteByteValueToFile( f, False, [$55] );

      // пишем число 0xAA
     WriteByteValueToFile( f, False, [$AA] );

      // пишем числа (в хекс) 92, 49, 24
     WriteByteValueToFile( f, False, [$92, $49, $24] );

   finally
      FreeAndNil(f);
   end;
   ShowMessage('Done');
end;

end.

Последний раз редактировалось Serge_Bliznykov; 10.07.2012 в 15:17.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.07.2012, 15:27   #13
Aristarh Dark
Форумчанин
 
Регистрация: 07.08.2007
Сообщений: 154
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Aristarh Dark, если размер файла не кратен трём, то после вашего кода в него добавятся лишние байты..
На самом деле не просто "лишние байты". Если размер файла не кратен трем, то файл займет все свободное место Но это было написано специально дабы вопрошающий немного задумался над кодом.
Aristarh Dark вне форума Ответить с цитированием
Старый 10.07.2012, 15:35   #14
MORPEH
Пользователь
 
Регистрация: 24.11.2009
Сообщений: 45
Восклицание

Я может что-то не понимаю, но почему ваш код так быстро работает, по сравнению с dmitriegorovih кодом

В разы быстрее, такое ощущение,что он что-то пропускает. Хотя я в ваш код добавил остальные циклы. Так быстро не может быть

Update. Смотрю исправили код, убрали константу. Но результат тот же. И не могли бы вы прокомментировать код.

Последний раз редактировалось MORPEH; 10.07.2012 в 16:14.
MORPEH вне форума Ответить с цитированием
Старый 10.07.2012, 17:51   #15
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Код:
for i:=1 to f.Size do begin
Serge_Bliznykov странно почему у вас
переменная i стоит то есть вы хотите перебрать значения которые не влезут в диапазон типа byte.
разве не n переменную нужно вставлять?
P.S. Самое интересное компилится и не выдает ошибки
P.P.S.
Цитата:
зачем чтение не понял, поэтому "закоментарил"
я делал на будущие когда потребуется писать по 3 байта хотя ща я понял что это не нужно :D
Воображение важнее, чем знания. (Albert Einstein)

Последний раз редактировалось dmitriegorovih; 10.07.2012 в 18:04.
dmitriegorovih вне форума Ответить с цитированием
Старый 10.07.2012, 19:05   #16
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от MORPEH Посмотреть сообщение
помогите реализовать алгоритм Питера Гутмана для файла. То есть, для уничтожения информации)).
Вообще говоря, для файла никакие алгоритмы уничтожения информации методом многократной перезаписи в принципе неприменимы.
Эти алгоритмы применяются исключительно к накопителю, причем накопителю, работающему по вполне определенному физическому принципу. Как правило, для магнитного носителя.
С файлом расположенном, скажем, на CD такое сделать принципиально невозможно ввиду отсутствия операции записи или стирания.
С флеш-памятью - своя проблема, т.к. при новой записи контроллер подставляет другие физические "сектора" с целью сделать износ ячеек более равномерным.
s-andriano вне форума Ответить с цитированием
Старый 10.07.2012, 19:37   #17
MORPEH
Пользователь
 
Регистрация: 24.11.2009
Сообщений: 45
По умолчанию

dmitriegorovih

Как в твоем примере, сделать что бы 3 числа шло?

s-andriano

Только для жестких дисков. Поэтому такой алгоритм должен работать
MORPEH вне форума Ответить с цитированием
Старый 10.07.2012, 20:38   #18
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Цитата:
Как в твоем примере, сделать что бы 3 числа шло?
ну как-то так
Код:
var
f:TFileStream;
filename:string;
n,n2:int64;
i:integer;
buffer:array [1..1024] of byte;
begin
randomize;
if Opendialog1.Execute then filename:=Opendialog1.FileName;
if fileexists(filename)=true then f:=TFileStream.Create(filename,fmOpenReadWrite)
else f:=TFileStream.Create(filename,fmCreate);
//------------------------------------------------------------------------------
f.Position:=0;
while f.Position<>f.Size do
begin
buffer[1]:=random(256); //ïñåâäîñëó÷àéíûå ÷èñëà
f.WriteBuffer(buffer,1);
end;
//------------------------------------------------------------------------------
f.Position:=0;
while f.Position<>f.Size do
begin
buffer[1]:=85; // ýòî ÷èñëî 55 â øåñòíàäöàòåðè÷íîé ñèñòåìå;
f.WriteBuffer(buffer,1);
end;
//------------------------------------------------------------------------------
f.Position:=0;
while f.Position<>f.Size do
begin
buffer[1]:=170; // ýòî ÷èñëî AA â øåñòíàäöàòåðè÷íîé ñèñòåìå;
f.WriteBuffer(buffer,1);
end;
//------------------------------------------------------------------------------
f.Position:=0;
n2:=f.Size div 3;
n:=0;
while n<>n2 do
begin
buffer[1]:=$92;
buffer[2]:=$49;
buffer[3]:=$24;
f.WriteBuffer(buffer,3);
n:=n+1
end;
if (f.Size mod 3)=2 then
begin
buffer[1]:=$92;
buffer[2]:=$49;
f.WriteBuffer(buffer,2);
end;
if (f.Size mod 3)=1 then
begin
buffer[1]:=$92;
f.WriteBuffer(buffer,1);
end;
//------------------------------------------------------------------------------
end;
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 11.07.2012, 00:36   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от dmitriegorovih
Serge_Bliznykov странно почему у вас
переменная i стоит то есть вы хотите перебрать значения которые не влезут в диапазон типа byte.
ну, разумеется, это банальнейший "косяк" с моей стороны.
А вылезет он, если файлик сделать размером более 255 байт!
конечно же, нужно делать переменную i того же типа, что и TFileStream.Size - а именно типа LongInt
Код:
var 
   i : LongInt;
   b, k : byte;
Цитата:
Сообщение от MORPEH
Я может что-то не понимаю, но почему ваш код так быстро работает, по сравнению с dmitriegorovih кодом

В разы быстрее, такое ощущение,что он что-то пропускает. Хотя я в ваш код добавил остальные циклы. Так быстро не может быть

Update. Смотрю исправили код, убрали константу. Но результат тот же. И не могли бы вы прокомментировать код.
Может, может!

Дело в том, что я не использую позиционирование в цикле. Это уже ОГРОМНЫЙ выигрыш в скорости.
Во-вторых, чтение нафик не нужно - это ещё плюс в быстродействии.
Ну и цикл for выполняется быстрее цикла while, т.к. не нужно вычислять размер файла при записи каждого байта..

Если хотите чуть чуть замедлить выполнение (и при этом, возможно, улучшить надёжность кода),
то после каждого цикла записи ЗАКРЫВАЙТЕ файл (это можно делать через метод деструктора f.Free;
или через вызов процедуры FreeAndNil(f);
но тогда, перед каждый новым циклом не забывайте заново открывать файл:
:=TFileStream.Create(fname,fmOpenRe adWrite);


а вообще, по сути задачи, я полностью согласен с постом #16 (c) s-andriano! Золотые слова. Можно перечитывать их до полного усвоения и просветления!

Последний раз редактировалось Serge_Bliznykov; 11.07.2012 в 00:39.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.07.2012, 08:06   #20
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Дело в том, что я не использую позиционирование в цикле. Это уже ОГРОМНЫЙ выигрыш в скорости.
Времена DOS давно миновали.
Современная реализация файловых функций работает абсолютно одинаково как при последовательном чтении, так и при чтении с последовательным позиционированием, т.к. не транслирует команды позиционирования жесткому диску без крайней необходимости.
Цитата:
Во-вторых, чтение нафик не нужно - это ещё плюс в быстродействии.
При наличии дискового кэша - разница ничтожно мала.
Цитата:
Ну и цикл for выполняется быстрее цикла while, т.к. не нужно вычислять размер файла при записи каждого байта..
Это совершенно несущественно, т.к. время вычисления несопоставимо меньше времени дисковых операций.

Таким образом, приходим к выводу, что в Вашем списке нет ни одной причины, по которой Ваш код мог бы работать быстрее аналога. (разумеется, возможно существование причин, о которых Вы не упомянули)

Кроме того, в Вашем коде я не обнаружил никаких средств отключения дискового кэша.
Так что вероятнее всего Ваша программа работает так:
- несколько раз обновляется значение в буфере записи,
- результат один раз записывается на диск.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Познакомлюсь с гетеросексуалистом из Питера Гвиневра Свободное общение 161 19.04.2012 10:41
Разработайте алгоритм методом пошаговой детализации и программу, реализующую этот алгоритм. iamhated Помощь студентам 1 15.01.2012 16:24
Разработайте алгоритм методом пошаговой детализации и программу, реализующую этот алгоритм iamhated Помощь студентам 1 14.01.2012 16:22
Программисты БД из Питера GRIV Фриланс 8 04.03.2011 16:28
Не желает работать правильно программа из Питера Абеля bullvinkle Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 28.02.2009 11:11