无法在文件中找到字符串并使用Inno Setup填充它? [英] Unable to Find String in a file and populate it using Inno Setup?

查看:150
本文介绍了无法在文件中找到字符串并使用Inno Setup填充它?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有demo.properties个文件,可以加载文件并进行迭代以获取其中的所有值.

I have demo.properties file from this I'm able to load file and iterate to get all values present in it.

hibernate.connection.username=jack
hibernate.connection.password=queen
hibernate.connection.url=jdbc:jtds:sqlserver://localhost/cabinet

但是当我得到第1行(能够逐行获取但无法获取特定的字符串)并且我想填充jack并将其存储到用户名String中时,类似地将Queen存入密码String中并将localhost存入数据库String中.这是我的代码/获取值的逻辑.

But when I get Line 1 (able to get line by line but unable to get specific string) and i want to populate jack and store into username String similarly queen into password String and localhost into database String.This is my code/logic to get values.

procedure InitializeWizard;
var  

  xmlInhalt: TArrayOfString;  
  k : Integer;
  CurrentLine : String;
  Uname : String;  
   Password : String;
   HostName : String;
   STR : String;                        

begin
          LoadStringsFromFile('C:\demo.properties', xmlInhalt);
          for k:=0 to GetArrayLength(xmlInhalt)<>-1 do
          begin
            CurrentLine := xmlInhalt[k];
            MsgBox(CurrentLine, mbError, MB_OK);
            if (Pos('hibernate.connection.username=', CurrentLine) <>-1 ) then
                begin
                              MsgBox(CurrentLine, mbError, MB_OK);
                    Uname := Pos('://', CurrentLine);
                    STR :=IntToStr(Uname);    
                    STR :=IntToStr(Length('://')); 
                    Password := Pos(':1', CurrentLine);
                    HostName :=Password -Uname;                  

              end;    
         end; 
end;

请帮助我获得我的要求.您的帮助将不胜感激.

please Help me to get my requirement.Your help will be appreciated.

推荐答案

如果TStrings类发布了NameValueSeparatorValues属性,我建议使用它.但是还没有,所以这是一个解决方法的代码(它使用TArrayOfString,但是对于TStrings类修改它很容易):

If the TStrings class had published NameValueSeparator and Values properties, I would suggest using it. But it hasn't, so here's a code to workaround (it uses TArrayOfString, but it would be easy to modify it for the TStrings class):

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Code]
function TryGetValue(const Strings: TArrayOfString; const Name: string;
  out Value: string): Boolean;
var
  S: string;
  P: Integer;
  I: Integer;
begin
  Result := False;
  { loop through the array }
  for I := 0 to GetArrayLength(Strings) - 1 do
  begin
    { store the currently iterated string into a local variable }
    S := Strings[I];
    { try to get position of the name value separator ('='in this case) }
    P := Pos('=', S);
    { if the separator was found on this line, and a text on the left of }
    { it matches (case insensitively) the input Name parameter value, we }
    { found what we were looking for, so return True and the rest of the }
    { text after the found separator }
    if (P <> 0) and (CompareText(Copy(S, 1, P - 1), Name) = 0) then
    begin
      Value := Copy(S, P + 1, MaxInt);
      Result := True;
      Exit;
    end;
  end;
end;

{ do note, that this function may not conform the RFC 3986 specification; }
{ preferred way should be e.g. InternetCrackUrl, but with this particular }
{ scheme (jdbc:jtds:sqlserver) it didn't crack the URL properly }
function GetHostName(const URL: string): string;
var
  P: Integer;
begin
  Result := '';
  P := Pos('://', URL);
  if P <> 0 then
  begin
    Result := Copy(URL, P + 3, MaxInt);
    P := Pos('/', Result);
    if P = 0 then
      P := MaxInt;
    Result := Copy(Result, 1, P - 1);
  end;
end;

procedure InitializeWizard;
var  
  URL: string;
  HostName: string;
  UserName: string;
  Password: string;
  StrArray: TArrayOfString;
begin
  if LoadStringsFromFile('C:\File.txt', StrArray) then
  begin
    TryGetValue(StrArray, 'hibernate.connection.url', URL);
    HostName := GetHostName(URL);
    TryGetValue(StrArray, 'hibernate.connection.username', UserName);
    TryGetValue(StrArray, 'hibernate.connection.password', Password);
    MsgBox(Format(
      'HostName: %s' + #13#10 + 'UserName: %s' + #13#10 + 'Password: %s', [
      HostName, UserName, Password]
    ), mbInformation, MB_OK);
  end; 
end;

这篇关于无法在文件中找到字符串并使用Inno Setup填充它?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆