Я думаю, что многие сталкивались с тем, что когда скачивали какой-нибудь файл из Интернета, то когда начинали данный файл разархивировать, а он запрашивал отправить смс с таким-то кодом, на такой-то номер. Так вот, мы в этой статье попытаемся создать такой же архиватор.
В данной статье мы будем рассматривать, как создать сам файл архива, который возможно только лишь открыть через Ваш собственный архиватор и просмотреть его.
Давайте создадим проект в Delphi и на форме разместим следующие компоненты:
У меня на форме следующие компоненты для создания архива:
- TListView
- TButton – 4 шт
- TEdit – 3 шт
Конечно, лучше всего разместить еще TEdit на форму, чтобы вы могли вводить пароль для этого архива, который будет приходить в ответной смс пользователю, но я не стал такое делать, если захотите, то все в Ваших руках.
Теперь давайте объявим запись, которая будет содержать все наши данные по файлу, в том числе стоимость смс, а также номер и текст смс. Она у меня выглядит следующим образом:
Type
TFileNfo=packed record
fn: string[255];
size: integer;
offset: LongInt;
stoim_sms:string;
phone_n:string;
text_sms:string;
pass:string;
end;
Теперь еще объявим переменную F, типа TFileStream, по которой мы можем определить необходимые атрибуты добавляемого в архив файла. Теперь на событие OnClick нашей кнопки Добавить напишем следующий код:
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
try
if OpenDialog1.Execute then
begin
F:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
ListFile.Add(OpenDialog1.FileName);
ListView1.Items.Add.Caption:=ExtractFileName(OpenDialog1.FileName);
ListView1.Items.Item[ListIndex].SubItems.Add(IntToStr(F.SIZE)+' bytes');
ListView1.Items.Item[ListIndex].SubItems.Add(OpenDialog1.FileName);
inc(ListIndex);
F.Free;
end;
finally
end;
end;
То есть открываем файл, с помощью переменной F:TFileStream, а затем заполняем поля нашего TListView:
- Имя файла
- Размер файла
- Путь к файлу
На событии OnClick кнопки Удалить я написал следующий код:
procedure TForm2.BitBtn2Click(Sender: TObject);
begin
try
ListView1.DeleteSelected;
Dec(ListIndex);
finally
end;
end;
В переменной ListIndex храниться количество наших файлов, который мы хотим добавить в архив. На событие OnClick кнопки Удалить все, я написал следующий код:
procedure TForm2.BitBtn3Click(Sender: TObject);
var
i:integer;
begin
try
for i := 0 to ListIndex - 1 do
begin
ListView1.Items.Delete(0);
end;
ListView1.Update;
ListIndex:=0;
finally
end;
end;
Естественно нам необходимо обнулить переменную ListIndex. И теперь переходим к самому главному пункта нашей статьи – формирование архива. На событие OnClick кнопки Запаковать, я написал следующий код:
procedure TForm2.BitBtn4Click(Sender: TObject);
var
i:integer;
size,dir,FileNames:string;
begin
try
if SaveDialog1.Execute then
FileNames:=SaveDialog1.FileName
else
exit;
Form1.ListView1.Clear;
for i := 0 to ListIndex - 1 do
begin
size:=ListView1.Items.Item[i].SubItems.CommaText;
dir:=ListView1.Items.Item[i].SubItems.CommaText;
Delete(size,1,1);
Delete(size,pos('"',size),length(size));
Form1.ListView1.Items.Add.Caption:=ListView1.Items.Item[i].Caption;
Form1.ListView1.Items.Item[Form1.LtvIndex].SubItems.Add(size);
inc(Form1.LtvIndex);
end;
sms:=Edit1.Text;
phone_number:=Edit2.Text;
text:=Edit3.Text;
Save(FileNames+'.MAF',ListFile);
finally
end;
end;
Архив я формирую с расширением *.MAF. Вы же можете выбрать любой другой, никто Вам этому не запретит. Также здесь я использую для архивации пользовательскую функцию Save, которая имеет следующий вид:
procedure Save(fn:string; fl:TStringList); // сохранить файлы в один // fn-имя файла, fl-список файлов, которые запихивать
var
k,i: integer;
f: TFileStream;
s: file;
o: integer;
r: TFileNfo;
p: ^byte;
begin
f:=TFileStream.Create(fn,fmCreate);
k:=fl.Count;
f.Write(k,SizeOf(k)); // сохраняем количество файлов
o:=SizeOf(r)*k+SizeOf(k); // смещение первого файла
if k>0 then for i:=0 to k-1 do begin // сохраняем заголовки
Assign(s,fl[i]); Reset(s,1);
r.fn:=fl[i]; r.size:=FileSize(s);
r.stoim_sms:=sms;
r.phone_n:=phone_number;
r.text_sms:=text;
r.offset:=o; o:=o+r.size;
f.Write(r,SizeOf(r));
CloseFile(s);
end;
if k>0 then for i:=0 to k-1 do begin // сохраняем файлы
Assign(s,fl[i]); Reset(s,1);
r.size:=FileSize(s);
GetMem(p,r.size);
BlockRead(s,p^,r.size,r.offset);
f.Write(p^,r.size);
FreeMem(p,r.size);
CloseFile(s);
end;
f.Free;
end;
Вот и все, в следующей статье, мы рассмотрим, как достать эти самые файлы из архива.
До встречи в следующей статье!
Также советуем почитать на PressDev.RU
Короткая ссылка: http://pressdev.ru/?p=311