Я включил журнал установки в Inno Setup, используя SetupLogging = yes
.
Он создает временный каталог файла журнала, и я копирую этот журнал в данные своей программы:
procedure DeinitializeSetup();
var
logfilepathname, newfilepathname: string;
begin
logfilepathname := ExpandConstant('{log}');
newfilepathname := 'ProgramData\InstallerlogFile'
FileCopy(logfilepathname, newfilepathname, false);
end;
Каждый раз, когда я создаю новый установщик, он заменяет содержимое старого файла в данных программы. Я хотел добавить новое содержимое журнала вместо его замены.
Самый простой способ добавить не слишком большое содержимое из одного файла в другой — использовать LoadStringFromFile и SaveStringToFile:
var
S: AnsiString;
begin
if LoadStringFromFile(logfilepathname, S) then
SaveStringToFile(newfilepathname, S, True); // True = append
end;
Или вы можете просто выполнить скопировать команду «cmd» с помощью Exec, когда «dest» уже существует (если нет, используйте свой FileCopy
код):
copy [/b] <dest> + <source>
Но для журнала это не сработает, поскольку он заблокирован процессами установки. Чтобы прочитать заблокированный файл, вам нужно прибегнуть к более низкоуровневым функциям. Вы можете использовать TFileStream с его fmShareDenyNone
.
Пример см. FileCopyUnrestricted
в моем ответе на
.
Как скопировать установщик во временный файл и затем запустить его?
Чтобы добавить его, замените
Stream := TFileStream.Create(NewFile, fmCreate);
с
if not FileExists(NewFile) then Mode := fmCreate
else Mode := fmOpenWrite;
Stream := TFileStream.Create(NewFile, Mode);
Stream.Seek(0, soFromEnd);
Mode
— Word
переменнаяTFileStream
, вы можете оптимизировать код, чтобы не загружать в память все содержимое сразу, если вам это понадобится. Вы этого не сделаете для файла журнала, поскольку он не слишком велик.