2016-05-03 6 views
1

Я хочу сделать установщик резервных копий Steam. Однако Steam позволяет пользователю создавать несколько папок библиотеки, что затрудняет установку.Прочитайте строки из файла и укажите вариант выбора установки

Есть несколько задач, которые я хочу выполнить.

  1. Установщик должен определить путь из реестра, чтобы определить, где установлен Steam.
  2. Полученный путь из реестра открытого файла

    X:\Steam\config\config.vdf 
    

    и читать значение "BaseInstallFolder_1", "BaseInstallFolder_2", "BaseInstallFolder_3" и т.д.

    Пример config.vdf:

    "NoSavePersonalInfo"  "0" 
    "MaxServerBrowserPingsPerMin"  "0" 
    "DownloadThrottleKbps"  "0" 
    "AllowDownloadsDuringGameplay"  "0" 
    "StreamingThrottleEnabled"  "1" 
    "AutoUpdateWindowStart"  "-1" 
    "AutoUpdateWindowEnd"  "-1" 
    "LastConfigstoreUploadTime"  "1461497849" 
    "BaseInstallFolder_1"  "E:\\Steam_GAMES" 
    
  3. Результирующий путь или путь файла config.vdf принести в DirEdit

  4. Если пользователь имеет несколько путей к папке в разных местах, а затем дают вариант выбор через DirTreeView или радиокнопку.

    Как это должно выглядеть следующим образом:

    enter image description here


Я знаю, как определить путь

WizardForm.DirEdit.Text := ExpandConstant('{reg:HKLM\SOFTWARE\Valve\Steam,InstallPath|{pf}\Steam}')+ '\steamapps\common\gamename'; 

Паровой Но трудно выполнять другие задачи

Заранее благодарим за помощь.

+0

Это два отдельных вопроса: разбор файла и реализующие выбор предопределенных путей. Спросите их отдельно. –

ответ

0

Для разбора config.vdf файла:

  • Загрузите файл с помощью LoadStringsFromFile.
  • И используйте строковые функции, такие как Copy, Pos, Delete, CompareText, чтобы разобрать его.
  • Для сохранения результатов используйте array of string (или предопределенные TArrayOfString). Чтобы выделить массив, используйте SetArrayLength.

Код может быть как:

function ParseSteamConfig(FileName: string; var Paths: TArrayOfString): Boolean; 
var 
    Lines: TArrayOfString; 
    I: Integer; 
    Line: string; 
    P: Integer; 
    Key: string; 
    Value: string; 
    Count: Integer; 
begin 
    Result := LoadStringsFromFile(FileName, Lines); 

    Count := 0; 

    for I := 0 to GetArrayLength(Lines) - 1 do 
    begin 
    Line := Trim(Lines[I]); 
    if Copy(Line, 1, 1) = '"' then 
    begin 
     Delete(Line, 1, 1); 
     P := Pos('"', Line); 
     if P > 0 then 
     begin 
     Key := Trim(Copy(Line, 1, P - 1)); 
     Delete(Line, 1, P); 
     Line := Trim(Line); 
     Log(Format('Found key "%s"', [Key])); 

     if (CompareText(Copy(Key, 1, Length(BaseInstallFolderKeyPrefix)), BaseInstallFolderKeyPrefix) = 0) and 
      (Line[1] = '"') then 
     begin 
      Log(Format('Found base install folder key "%s"', [Key])); 
      Delete(Line, 1, 1); 
      P := Pos('"', Line); 
      if P > 0 then 
      begin 
      Value := Trim(Copy(Line, 1, P - 1)); 
      StringChange(Value, '\\', '\'); 
      Log(Format('Found base install folder "%s"', [Value])); 
      Inc(Count); 
      SetArrayLength(Paths, Count); 
      Paths[Count - 1] := Value; 
      end; 
     end; 
     end; 
    end; 
    end; 
end;