Ну что дорогие друзья, настало время поговорить о второй части статьи, в которой пойдет речь о том как создать платные архивы. В первой части статьи, мы поговорили о том, как создать этот самый архив, а теперь нам главное (точнее для пользователя) разархививароть его.
В первой статье, я говорил, что Вам в Вашей структуре файлов, необходимо создать поле, в которое будет записываться код, который будет приходить пользователям, в смс. Так вот, здесь же, мы будем все эти поля читать и сравнивать с тем, которые ввел пользователь.
Итак, для того, чтобы открыть на архив и посмотреть список файлов, который находятся в нем, я написал следующий код:
procedure TForm1.ToolButton4Click(Sender: TObject);
var
i,index_item:integer;
begin
try
if OpenDialog1.Execute then
begin
index_info_file:=1;
index_item:=0;
ListView1.Clear;
FileNames:=OpenDialog1.FileName;
Loads(OpenDialog1.FileName);
for i := 1 to index_info_file do
begin
ListView1.Items.Add.Caption:=ExtractFileName(arr_InfoFile[i].fn);
ListView1.Items.Item[index_item].SubItems.Add(IntToStr(arr_InfoFile[i].size)+' bytes');
inc(index_item);
end;
end
else
exit;
finally
end;
end;
То есть, с помощью диалога, указываем путь к нашему архиву и открываем его. Для отображения списка файлов в архиве, я использую компонент TListView. Также я написал пользовательскую процедуру Loads, которая ищет в архиве все имена файлов, которые я затем добавляю в TListView. Данная процедура у меня выглядит следующим образом:
procedure Loads(fl:string); // чтение нужного файла из кучи
var
k,i: integer;
f: TFileStream;
r: TFileNfo;
begin
f:=TFileStream.Create(fl,fmOpenRead);
f.Read(k,SizeOf(k)); i:=0; // читаем количество файлов
while i<k do begin // читаем заголовки файлов пока не найдем нужный
f.ReadBuffer(r,SizeOf(r));
arr_InfoFile[index_info_file].fn:=r.fn;
arr_InfoFile[index_info_file].size:=r.size;
arr_InfoFile[index_info_file].stoim_sms:=r.stoim_sms;
inc(index_info_file);
inc(i);
end;
index_info_file:=k;
f.Free;
end;
В процедуру достаточно передать имя архива (полный путь к нему), чтобы она корректна работала. Естественно надо передавать путь к архиву тот, который вы создали с помощью данной программы, что описано в первой статье. Как Вы видите, здесь я считываю поля нашей записи, которые мы указывали при создании архива: стоимость смс и так далее, здесь необходимо считать код смс и показывать окно, в котором пользователь будет вводить код, который пришел ему на телефон. Сделать проверку и если она совпадет, то приступать к разархивированию, о чем я напишу ниже.
Для того, чтобы разархивировать данные файлы, для этого я использую пользовательскую процедуру Load, которая выглядит следующим образом:
procedure Load(fl, fn:string; var s:TMemoryStream); // чтение нужного файла из кучи
var
k,i: integer;
f: TFileStream;
p: ^byte;
r: TFileNfo;
begin
f:=TFileStream.Create(fl,fmOpenRead);
s.Clear;
f.Read(k,SizeOf(k)); i:=0; // читаем количество файлов
while i<k do begin // читаем заголовки файлов пока не найдем нужный
f.ReadBuffer(r,SizeOf(r));
if r.fn=fn then i:=k; // так можно получить и список файлов в файле
inc(i);
end;
if i>k then begin //если есть нужный файл - читаем его
f.Seek(r.offset,soFromBeginning);
GetMem(p,r.size);
f.ReadBuffer(p^,r.size);
s.WriteBuffer(p^,r.size); // и запихиваем в стрим
FreeMem(p,r.size);
end;
f.Free; s.Position:=0;
end;
А применяется она достаточно просто:
procedure TForm1.Button2Click(Sender: TObject);
var
m: TMemoryStream;
begin
m:=TMemoryStream.Create;
Load('имя архива','имя файла',m);
m.SaveToFile('путь к сохранению файла');
m.Free;
end;
Все очень просто, имя архива мы знаем – знаем, имя файла – которые нам необходимо разархививароть знаем – знаем (мы их получаем с помощью процедуры Loads), а пользователь уже сам укажет, куда файлы надо сохранить. Вот и все!
Прикладываю довольно таки сырой проект, но может кому больше поможет чем статьи, до новых встреч!
Также советуем почитать на PressDev.RU
Короткая ссылка: http://pressdev.ru/?p=352