![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Мне поручили написать электронный учебник на делфи. И у меня возник вопрос о том как спрятать информацию от глаз? То есть конечно можно все в архив запоролить,но это как то не ок.
Может использовать пакеты или еще что? Материал учебника представлен в виде .txt и .html файлов. Я не силен в этих вопросах поэтому пришел сюда. У кого какие советы или статьи буду рад помощи. Заранее спасибо. |
|
#2
|
||||
|
||||
|
Xorом закриптовать в ресурсе.
|
|
#3
|
|||
|
|||
|
Не надо прятать то, что не нужно прятать. Максимум - затруднить простое чтение, для чего достаточно просто сохранить все в один файл (поток). А вот если там есть тесты, то их надо спрятать, точнее надо спрятать правильные ответы.
|
|
#4
|
||||
|
||||
|
Да я и сам не собирался нечего прятать,хотел тесты зашифровать,ибо ключ к тестам там же,да и что бы не смотрели вопросы. Но мне сказали что надо всё спрятать так что вот теперь сижу и думаю как и куда.
|
|
#5
|
|||
|
|||
|
Как тут уже писали - все гениальное просто.
Просто запакуй файлы с помощью zlib. Начиная с Delphi 6, в поставке есть готовые потоки с поддержкой сжатия. Т.е. тебе нужна будет спец утилитка для подготовки файлов (сжатия их). а читать надо через соотв. поток. Я делаю вот так: Код:
procedure TModelBase.BackupToFile(AFileName: String);
var
AStream : TFileStream;
AZLib : TCompressionStream;
begin
AStream := TFileStream.Create(AFileName,fmCreate);
AZLib := TCompressionStream.Create(clMax,AStream);
Try
SaveToStream(AZLib);
Finally
AZLib.Free;
AStream.Free;
End;
end;
procedure TModelBase.RestoreFromFile(AFileName: String);
var
AZLib : TDecompressionStream;
AStream : TFileStream;
begin
AStream := TFileStream.Create(AFileName,fmOpenRead);
AZLib := TDecompressionStream.Create(AStream);
Try
LoadFromStream(AZLib);
Finally
AZLib.Free;
AStream.Free;
End;
end;Методы LoadFromStream и SaveToStream внутри работают с обычным потоком (TStream). |
|
#6
|
||||
|
||||
|
Лирическое отступление
Во времена учебы в колледже, у нас были электронные учебники, работающие в браузере, так вот, там была защита от копипаста, а обходилась она простым сохранением текущей страницы в текстовый файл. |
|
#7
|
||||
|
||||
|
Imikle, спасибо за ответ,вот только возникла ошибка при чтение файла,сохраняет хорошо а вот при чтение выдает ошибку "EDecompressionError 'Invalid Stream Operation' " вот код
Код:
procedure TForm1.btn2Click(Sender: TObject);
var
AZLib : TDecompressionStream;
AStream : TFileStream;
begin
AStream := TFileStream.Create('C:\Users\User\Desktop\Новая папка (3)\qwe.txt',fmOpenRead);
AZLib := TDecompressionStream.Create(AStream);
Try
mmo1.Lines.LoadFromStream(AZLib);/////вот тут ошибка
Finally
AZLib.Free;
AStream.Free;
End;
end; |
|
#8
|
|||
|
|||
|
Да, походу Size для сжатого потока не определен. Придется выяснять длинну при записи, писать ее, потом данные. Читать в обратном порядке.
ЗЫ. В моем случае просто нет чтения всего потока, я читаю конкретные данные, конкретной длинны (по типам данных соотв. полей). Для выяснения размера данных можно использовать промежуточный поток, например TMemoryStream. |
|
#9
|
|||
|
|||
|
Да, вот так работает:
Код:
uses
ZLib;
procedure TForm1.Button1Click(Sender: TObject);
var
AStream : TFileStream;
AZLib : TCompressionStream;
AMemStream : TMemoryStream;
ALen : Int64;
begin
AStream := TFileStream.Create('c:\test.z',fmCreate);
AMemStream := TMemoryStream.Create;
AZLib := TCompressionStream.Create(clMax,AStream);
Try
Memo1.Lines.SaveToStream(AMemStream);
AMemStream.Seek(0,0);
ALen := AMemStream.Size;
AZLib.WriteBuffer(ALen,SizeOf(Int64));
AZLib.CopyFrom(AMemStream,ALen);
Finally
AZLib.Free;
AStream.Free;
End;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
AZLib : TDecompressionStream;
AStream : TFileStream;
AMemStream : TMemoryStream;
ALen : Int64;
begin
AStream := TFileStream.Create('c:\test.z',fmOpenRead);
AZLib := TDecompressionStream.Create(AStream);
AMemStream := TMemoryStream.Create;
Try
AZLib.ReadBuffer(ALen,SizeOf(Int64));
AMemStream.CopyFrom(AZLib,ALen);
AMemStream.Seek(0,0);
Memo1.Lines.LoadFromStream(AMemStream);
Finally
AMemStream.Free;
AZLib.Free;
AStream.Free;
End;
end; |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
JunkieBeat (18.01.2014)
| ||
|
#10
|
||||
|
||||
|
Да,спасибо все прекрасно работает )
|