root/branches/0_1_3/Archiver.pas

Revision 101, 6.5 kB (checked in by sagrer, 1 year ago)
  1. Покромсал райзы из SourcePackBuilder? и Archiver
  2. Поменял представление номера версии для всех утилит - теперь обычное 4-значное значение, без явного выделения ревизии ибо некрасиво %).
Line 
1 ///////////////////////////////////////////////////////////
2 //                     GGBuildTools                      //
3 //    Набор утилит для сборки проектов Gipat Group       //
4 //             Copyright (C) 2007 Gipat Group            //
5 //              Распространяется на условиях             //
6 //    Gipat Group's opened EI-editor-utility license     //
7 //                      версии 1.1                       //
8 //                                                       //
9 //                  www.gipatgroup.org                   //
10 ///////////////////////////////////////////////////////////
11
12 //К работе над данным файлом приложили руки, ноги.... короче аффтары:
13 // 1) Immortal (ImmortalGAD@rambler.ru)
14 // 2) Sagrer (sagrer@yandex.ru)
15
16 ////////////////////////////////////////////////////////////////////////.
17 //
18 //   Unit Archiver . Содержит враперы для работы непосредственно с архиваторами
19 //
20 ////////////////////////////////////////////////////////////////////////.
21 unit Archiver;
22
23 {$mode objfpc}{$H+}
24
25 interface
26
27 uses
28   Classes, SysUtils, SconfFormat, ExtraFileUtilsLCL, process;
29
30 const
31   ARCHIVER_NAME_7ZIP = '7z';
32   ARCHIVER_7ZIP_EXTENSION = '.7z';
33   ARCHIVER_7ZIP_DefUtilPath = '.\..\ExtTools\7zr.exe';
34
35 type
36
37   // Базовый тип для архиваторов, определяет их общий интерфейс, оставляя реализацию самой архивации
38   // свим наследникам
39   TArchiver = class
40   public
41     UseSubfolder  :Boolean;        // пока не юзается
42     Name          :String;         // имя пакета
43     SourceDir     :String;         // откуда брать файлы
44     OutputDir     :String;         // куда ложить архив
45     ErrorMessage : AnsiString;     // Сообщение о последней ошибке.
46     UtilPath : AnsiString;    //Путь к бинарнику архиватора.
47     //Конструкторы-деструкторы...
48     constructor Create; virtual;
49     destructor Destroy; override;
50     //Открытые методы.
51     function GetFullArchiveName() : AnsiString; virtual; abstract;   //Типо вернуть полное имя архива.
52     function Pack() : Boolean; virtual; abstract;    // типа пустой метод.
53
54   end;
55  
56   // Класс для архивации , с помощью 7zr.exe
57   T7ZipArchiver = class(TArchiver)
58   public
59     //Конструкторы-деструкторы...
60     constructor Create; override;
61     destructor Destroy; override;
62     //Открытые методы.
63     function GetFullArchiveName() : AnsiString; override;   //Типо вернуть полное имя архива.
64     function Pack() : Boolean; override;   // Выполняет всю работу связанную с архивированием
65
66   end;
67  
68   // глобал фактори-метод. Возвращает нужный архиватор по требованию.
69   function GetArchiverByType(const typeA :String):TArchiver;
70  
71 implementation
72
73 /////////////////////////////////////////////
74 //                 Функции                 //
75 /////////////////////////////////////////////
76
77 // глобал фактори-метод. Возвращает нужный архиватор по требованию.
78 function GetArchiverByType(const typeA :String):TArchiver;
79 begin
80   // дефолт значение , если не найдем.
81   Result := nil;
82   if (ScF_ArchiveType_7z = typeA) then begin
83     Result := T7ZipArchiver.Create;
84   end;
85 end;
86
87 /////////////////////////////////////////////
88 //                TArchiver                //
89 /////////////////////////////////////////////
90
91 //-----------------------------------------//
92 //        Конструкторы-деструкторы...      //
93 //-----------------------------------------//
94
95 constructor TArchiver.Create;
96 begin
97   //Проставить дефолтные значения...
98
99  
100   //Просто забить инфу в переменные...
101   Self.UtilPath := '';
102   Self.ErrorMessage := '';
103
104   //Создать вложенные объекты классов...
105
106 end;
107
108 destructor TArchiver.Destroy;
109 begin
110   //Выкидываем мусор
111
112   //Выполнить унаследованный деструктор
113   inherited;
114 end;
115
116 /////////////////////////////////////////////
117 //              T7ZipArchiver              //
118 /////////////////////////////////////////////
119
120 //-----------------------------------------//
121 //        Конструкторы-деструкторы...      //
122 //-----------------------------------------//
123
124 constructor T7ZipArchiver.Create;
125 begin
126   //Выполнить унаследованный конструктор.
127   inherited;
128  
129   //Проставить дефолтные значения...
130
131   //Просто забить инфу в переменные...
132
133   //Создать вложенные объекты классов...
134
135 end;
136
137 destructor T7ZipArchiver.Destroy;
138 begin
139   //Выкидываем мусор
140
141   //Выполнить унаследованный деструктор
142   inherited;
143 end;
144
145 //------------------------------------------//
146 //            Открытые методы...            //
147 //------------------------------------------//
148
149 function T7ZipArchiver.GetFullArchiveName() : AnsiString;
150 //Типо вернуть полное имя архива.
151 begin
152   Result := ResolveLocalPath(Name, OutputDir) + ARCHIVER_7ZIP_EXTENSION;
153 end;
154
155 // Выполняет всю работу связанную с архивированием
156 function T7ZipArchiver.Pack() : Boolean;
157 var
158   path :String;        // Путь у 7zr.exe
159   args :String;        // Аргументы
160   packagePath :String; // Итоговый путь к архиву
161   process :TProcess;   // Объект для выполняемого процесса
162  
163 begin
164   //Инициализация.
165   Result := true;
166  
167   // Получаем путь к утилите.
168   if FileExists(Self.UtilPath) = false then begin
169     //Йузверопрограммер не задал явно правильный путь к утилите - пытаемся её найти.
170     path := ResolveLocalPath(ARCHIVER_7ZIP_DefUtilPath, ExtractFilePath(ParamStr(0)));
171     if FileExists(path) = false then begin
172       //Нема утилиты. Обломс.
173       Result := false;
174       Self.ErrorMessage := 'Can''t find 7zr utility! File '+path+' is not exists.';
175     end;
176   end
177   else begin
178     //Тулса задана, фсе ок.
179     path := Self.UtilPath;
180   end;
181  
182   //Если фсеок - продолжаем.
183   if Result = true then begin
184     // Формируем путь к архиву
185     packagePath := Self.GetFullArchiveName();
186     // Формируем строку аргументов.
187     args := Format('a -mx=9 -ms=on "%s" "%s"', [packagePath, SourceDir]);
188
189     // Кильнем архив, если он уже созданн. Для надежности.
190     if FileExists(packagePath) then begin
191       DeleteFile(packagePath);
192     end;
193
194     // Создаем рабочий процесс
195     process := TProcess.Create(nil);
196     process.CommandLine := Format('"%s" %s',[path, args]);
197     // Запретить вывод в консоль.
198     process.Options := [poNoConsole, poWaitOnExit];
199     // Запускаем
200     process.Execute;
201     process.Free;
202
203     // Если процесс провалился. По идее если преддыдущие проверки выполненились, то
204     // такого быть не должно. На всякий случай
205     if process.ExitStatus <> 0 then begin
206       Result := false;
207       Self.ErrorMessage := 'Extern Process execution faild! '+path+' was executed.';
208     end;
209   end;   //if Result = true
210 end;
211
212 end.
213
Note: See TracBrowser for help on using the browser.