Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как заменить TFileStream на TStringStream


Автор: aleks0506 29.11.2012, 22:06
Здравствуйте Уважаемые! Помогите решить, казалось бы, простую задачку:
есть такая библиотека DCPcrypt (для работы с шифрованием), в ней есть функция для шифрования файла, выглядит она так:

function TForm1.EncryptFile(Source, Dest, Password: string): Boolean; 
var
  DCP_rijndael1: TDCP_rijndael;
  SourceStream, DestStream: TFileStream;
begin
  Result := True;
  try
    SourceStream := TFileStream.Create(Source, fmOpenRead);
    DestStream := TFileStream.Create(Dest, fmCreate);
    DCP_rijndael1 := TDCP_rijndael.Create(Self);
    DCP_rijndael1.InitStr(Password, TDCP_sha1);
    DCP_rijndael1.EncryptStream(SourceStream, DestStream, SourceStream.Size);
    DCP_rijndael1.Burn;
    DCP_rijndael1.Free;
    DestStream.Free;
    SourceStream.Free;
  except
    Result := False;
  end;
end;

Все бы хорошо, если бы не одно БОЛЬШОЕ НО - на вход ЭТОЙ функции нужно подавать ФАЙЛ, а мне нужно подать ОБЪЕКТ! (т.к. данные которые нужно зашифровать находятся в объекте TSringList)
я попытался переделать эту функцию с использованием TStringStream - вот что получилось:

function TForm1.EncryptFileToStream(Source, Password: string): Boolean;  
var
  DCP_rijndael1: TDCP_rijndael;
  DestStream: TFileStream;
  stream: TStringStream;
begin
  Result := True;
  try
    DestStream := TFileStream.Create(Source, fmOpenRead);
    stream:=TStringStream.Create('');
      tstTV.SaveToStream(stream); // tstTV это глобальный объект-содержит список строк
      stream.Position := 0; 
    DCP_rijndael1 := TDCP_rijndael.Create(Self);
    DCP_rijndael1.InitStr(Password, TDCP_sha1);
    DCP_rijndael1.EncryptStream(stream, DestStream, stream.Size);
    DCP_rijndael1.Burn;
    DCP_rijndael1.Free;
    stream.Free;
    DestStream.Free;

  except
    Result := False;
  end;
end;

Вроде все правильно! Ошибок не выдает! Код выполняется - но файл даже НЕ СОХРАНЯЕТСЯ...(даже не создается)
(все проверил - данные в объекте tstTV есть(набор строк))

Как думаете, в чем может быть проблема? 
Поделитесь мыслями, умоляю! 

Автор: Poseidon 29.11.2012, 22:36
Вопрос, зачем шифровать объект?

Автор: kami 29.11.2012, 22:54
Цитата(aleks0506 @  29.11.2012,  22:06 Найти цитируемый пост)
 DestStream := TFileStream.Create(Source, fmOpenRead);

Если бы это был SourceStream, то вопросов не было бы. А так:
1. Открытие только на чтение, что автоматически не дает ничего записать в этот файловый поток.
2. Опять-таки, открытие только на чтение - а если файла нет, кто его создаст?

Автор: aleks0506 30.11.2012, 07:06
Вопрос решен! 
Kami - Огромное СПАСИБО!)

p.s. загвоздка действительно была в том, что открытие файла происходило только на чтение... (стыдно мне - за такую невнимательность)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)