Вопрос Inno Setup. Работа с файлами

jason

Мимокрокодил
Необходимо в скопированном файле File.txt найти значение "FromStr" и поменять его на "ToStr" Нагуглил следующий код, но почему-то он не работает, пробовал экспериментировать читать мануал, но похоже программист из меня не очень,. Пожалуйста помогите найти ошибку. Дистрибутив inno setup v5.5.8-unicode.exe, ос windows 7

Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: "File.txt"; DestDir: "{app}\Files"; Flags: ignoreversion;

[Code]
var
  UnicodeStr: string;
  ANSIStr: AnsiString;
begin
  LoadStringFromFile(ExpandConstant('{app}\Files\File.txt'), ANSIStr)
  UnicodeStr := String(ANSIStr);
  StringChangeEx(UnicodeStr, ExpandConstant('"FromStr"'), ExpandConstant('"ToStr"'), False)
  SaveStringToFile('{app}\Files\File.txt', AnsiString(UnicodeStr), True);
end.
 

Shegorat

Lord of Madness
Администратор
jason
Кавычки нужно убрать у текста, если я правильно понял суть проблемы. Функция ищет точное значение. Она заменит значение "FromStr" на "ToStr".

Код:
[Code]
var
  UnicodeStr: string;
  ANSIStr: AnsiString;
begin
  LoadStringFromFile(ExpandConstant('{app}\Files\File.txt'), ANSIStr)
  UnicodeStr := String(ANSIStr);
  StringChangeEx(UnicodeStr, 'FromStr', 'ToStr', False)
  SaveStringToFile('{app}\Files\File.txt', AnsiString(UnicodeStr), True);
end.
 

jason

Мимокрокодил
Shegorat
Попробовал скопировать ваш код, проверял в том числе еще несколько комбинаций.
Файл вроде обычный txt, в нем может быть проблема? http://www45.zippyshare.com/v/mRxrz1LC/file.html
А как посмотреть значение переменной UnicodeStr в текущий момент, в AutoIt бывает msgbox, может в innosetup есть подобное? И еще интересно когда выполняется секция Code (после или во время установки основной части инсталлятора)?
 

Shegorat

Lord of Madness
Администратор
Так, стоп. А где собственно вызов этого кода? Вот так он будет вызван на этапе установки, после извлечения всех файлов.
Код:
[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  UnicodeStr: string;
  ANSIStr: AnsiString;
begin
  if (CurStep = ssPostInstall) then begin
    LoadStringFromFile(ExpandConstant('{app}\Files\File.txt'), ANSIStr)
    UnicodeStr := String(ANSIStr);
    StringChangeEx(UnicodeStr, 'FromStr', 'ToStr', False)
    SaveStringToFile('{app}\Files\File.txt', AnsiString(UnicodeStr), True);
  end;
end;
В Inno определены процедуры, которые вызываются на каждом этапе установки. Почитайте справку по этому поводу.
 

jason

Мимокрокодил
Спасибо за помощь! После нескольких попыток исталлятор обработал файл,

Оказалось что еще в SaveStringToFile нужно указать параметр False вместо True. Иначе на выходе получается смесь из двух файлов
И добавить ExpandConstant в пути до сохраняемого файла чтобы он обрабатывал значение переменной {app}

Получился такой код , может быть еще кому-нибудь пригодится
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: "File.txt"; DestDir: "{app}\Files"; Flags: ignoreversion;

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  UnicodeStr: string;
  ANSIStr: AnsiString;
begin
  if (CurStep = ssPostInstall) then
  begin
  LoadStringFromFile(ExpandConstant('{app}\Files\File.txt'), ANSIStr)
  UnicodeStr := String(ANSIStr);
  StringChangeEx(UnicodeStr, 'FromStr', 'ToStr', False)
  SaveStringToFile(ExpandConstant('{app}\Files\File.txt'), AnsiString(UnicodeStr), False);
  end;
end;
 
Последнее редактирование:

jason

Мимокрокодил
Обнаружил еще одну проблему, у меня вместо значения 'ToStr' будет ExpandConstant('{userdocs}') с кириллическими символами, а редактируемый текстовый файл в кодировке UTF-8.
Как можно сохранить файл в кодировке UTF-8 чтобы не было кракозябр?

Нашел упоминание об этом здесь -
http://stackoverflow.com/questions/14693425/does-inno-setups-expandconstant-support-utf-8
http://www.jrsoftware.org/ishelp/index.php?topic=unicode
http://stackoverflow.com/questions/35117362/save-ini-file-in-utf-8-rather-than-ansi-in-inno-setup
Но не хватает знаний разобраться
 
Последнее редактирование:

SBalykov

Старожил
Обнаружил еще одну проблему, у меня вместо значения 'ToStr' будет ExpandConstant('{userdocs}') с кириллическими символами, а редактируемый текстовый файл в кодировке UTF-8.
Как можно сохранить файл в кодировке UTF-8 чтобы не было кракозябр?
Unicode Converter
А вообще, в UTF-8 кириллица читается нормально ...
 

Доктор ВОВАН

Мимокрокодил
Здравствуйте. А можно ли в эту строчку внести путь установки {app}" (выделено)
т.е мне надо DSTCOPY заменить на DSTCOPY = "{pf}\my prog (например)
в текстовом файле ops.txt

Код:
procedure CurStepChanged(CurStep: TSetupStep);
var
  UnicodeStr: string;
  ANSIStr: AnsiString;
begin
  if (CurStep = ssPostInstall) then
  begin
  LoadStringFromFile(ExpandConstant('{app}\Files\ops.txt'), ANSIStr)
  UnicodeStr := String(ANSIStr);
  StringChangeEx(UnicodeStr, 'DSTCOPY', 'DSTCOPY = "{app}"', False)
  SaveStringToFile(ExpandConstant('{app}\Files\ops.txt'), AnsiString(UnicodeStr), False);
  end;
end;
Спасибо заранее.
 

Nemko

Дилетант
Модератор
Доктор ВОВАН, можно использовать функцию WizardDirValue, передающую путь установки:

Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={sd}\My Application

[Files]
Source: "ops.txt"; DestDir: "{app}\Files";

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  UnicodeStr: String;
  ANSIStr: AnsiString;
begin
  if (CurStep = ssPostInstall) then begin
    LoadStringFromFile(ExpandConstant('{app}\Files\ops.txt'), ANSIStr);
    UnicodeStr:=String(ANSIStr);
    StringChangeEx(UnicodeStr, 'DSTCOPY', 'DSTCOPY = ' + WizardDirValue, False);
    SaveStringToFile(ExpandConstant('{app}\Files\ops.txt'), AnsiString(UnicodeStr), False);
  end;
end;
 

LexBell

Борода
Супер модератор
Еще проще, если файл имеет структуру ini, что очен похоже, можно использовать встроенные средства работы с ini файлами
 

Доктор ВОВАН

Мимокрокодил
LexBell, точно не ини. простой текст файл.
вопрос решился отлично тк. нужно было еще "" кавычки добавить. "{pf}\my prog" Может кому пригодится. Спасибо товарисчу Gnom_aka_Lexander

StringChangeEx(UnicodeStr, 'DSTCOPY', 'DSTCOPY = "'+ExpandConstant('{app}')+'"', False

Nemko, Здоровья и Удачи Вам. Спасибо.
 
Сверху