Вопрос Нужна помощь с проверкой существования файлов

Alexandr_57

Новичок
Здраствуйте.
Нужна помощь с проверкой на существование файла перед его установкой.
Тоесть если файл существует устанавливать его в другую папку.
Для этого вполне подойдет If и FileExists
Как сделать для одного файла теоретически я знаю. Но вся загвоздка что файлов очень много. И писать для каждый файл функцию отнимет сильно много времени.
Вот я и прошу помощи с проверкой сразу ко всем файлам в папке и подпапках.
Может кто помочь,
 

Хамик

Старожил
Alexandr_57, Попробуйте вот такой велосипед:)
Код:
#define Dir "OtherDir"

[Setup]
AppName=App
AppverName=App v1.0
DefaultDirName={pf}\App
OutputDir=.

[files]
Source: "{app}\*.*"; DestDir: "{app}\{#Dir}"; Flags: skipifsourcedoesntexist overwritereadonly ignoreversion external
Source: "{app}\image\*"; DestDir: "{app}\{#Dir}\image"; Flags: skipifsourcedoesntexist overwritereadonly ignoreversion external
Source: "{app}\skin\*"; DestDir: "{app}\{#Dir}\skin"; Flags: skipifsourcedoesntexist overwritereadonly ignoreversion external
Source: "{app}\lang\*"; DestDir: "{app}\{#Dir}\lang"; Flags: skipifsourcedoesntexist overwritereadonly ignoreversion external

Source: "Files\*.*"; DestDir: "{app}\"; Flags: ignoreversion
Source: "Files\image\*"; DestDir: "{app}\image"; Flags: ignoreversion
Source: "Files\skin\*"; DestDir: "{app}\skin"; Flags: ignoreversion
Source: "Files\lang\*"; DestDir: "{app}\lang"; Flags: ignoreversion

[code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssDone then
  begin
    DeleteFile(ExpandConstant('{app}\{#Dir}\unins000.dat'));
    DeleteFile(ExpandConstant('{app}\{#Dir}\unins000.exe'));
    RemoveDir(ExpandConstant('{app}\{#Dir}'));
  end;
end;
 

Alexandr_57

Новичок
Как я сказал нужно файлы устанавливать в другую папку только тогда когда они существуют в папке.
Дело в том что сначало идет установка оригинальных файлов. Потом установка модифмикации. Файлы модификации могут совподать с именем модификации.
Тут как вариант либо менять имя файла или просто устанавливать в другую папку. Но ни как удалять оригинальные файлы. Как никак dlc должен дополнять оригинал а не заменять его.
Твой пример както не могу разобрать
 
Последнее редактирование:

SBalykov

Старожил
Как я сказал нужно файлы устанавливать в другую папку только тогда когда они существуют в папке.
Дело в том что сначало идет установка оригинальных файлов. Потом установка модифмикации. Файлы модификации могут совподать с именем модификации.
Тут как вариант либо менять имя файла или просто устанавливать в другую папку. Но ни как удалять оригинальные файлы. Как никак dlc должен дополнять оригинал а не заменять его.
Твой пример както не могу разобрать
Если так, то проверка в принципе не нужна. Устанавливаете моды в отдельную папку и запускаете их через батник ...
 

Alexandr_57

Новичок
Моды это не те которые можно запустить. Моды это dlc дополнительные ресурсы
Изначально я и делал запись в отдельную папку. Но одному умнику не понравилось их вручную выковыркивать. Поэтому теперь я делаю выбор куда установить dlc
либо в отдельную папку. При таком варианте весь dlc устанавливается в отдельную папку. Либо в папку с RTP при таком варианте все файлы что не заменяют оригинальные должны копироваться в RTP а остальные в DLC
Собственно из за этогног нужна проверка и если файл существует ставить в отдельную папку
 

David.D.Rocco

Участник
Проверенный
Код:
[files]
Source: "C:\Files\*.*"; DestDir: "{app}\rtp"; Check: exists;
Source: "C:\Files\*.*"; DestDir: "{app}\dlc"; Check: not exists;

[code]
function exists(): boolean;
begin
  Result := FileExists(ExpandConstant('{app}\dlc\') + ExtractFileName(CurrentFileName));
end;

// если файл существует в {app}\dlc то он ставится в {app}\rtp. в {app}\dlc остается старый файл
// иначе если файл отсутствует в {app}\dlc то он устанавливается в {app}\dlc и не ставится в {app}\rtp
// ВАЖНО! сначало файлы нужно ствить в {app}\rtp
 

Alexandr_57

Новичок
Код:
[files]
Source: "C:\Files\*.*"; DestDir: "{app}\rtp"; Check: exists;
Source: "C:\Files\*.*"; DestDir: "{app}\dlc"; Check: not exists;

[code]
function exists(): boolean;
begin
  Result := FileExists(ExpandConstant('{app}\dlc\') + ExtractFileName(CurrentFileName));
end;

// если файл существует в {app}\dlc то он ставится в {app}\rtp. в {app}\dlc остается старый файл
// иначе если файл отсутствует в {app}\dlc то он устанавливается в {app}\dlc и не ставится в {app}\rtp
Реально спасибо. Это работает для рекурсивных флагов тоесть сразу для нескольких файлов?
Нет. Но хоть както облегчает задачу. Правдо без рекурсии сложно все равно
Рекурсией я подразумеваю вложенные подпапки
 
Последнее редактирование:

David.D.Rocco

Участник
Проверенный
да. я на нескольких файлах попробовал. но лучше заранее протестируй.
// ВАЖНО! сначало файлы нужно ставить в {app}\rtp
 

Alexandr_57

Новичок
да. я на нескольких файлах попробовал. но лучше заранее протестируй.
// ВАЖНО! сначало файлы нужно ставить в {app}\rtp
Да мне для этих файлов:
Код:
Source: "MV\dlc\Additional\CodeOfPrincess\characters\*"; DestDir: "{app}\NewData\img\characters"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\CodeOfPrincess\face\*"; DestDir: "{app}\NewData\img\faces"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\CodeOfPrincess\picture\*"; DestDir: "{app}\NewData\img\pictures"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\Cover Art Characters\bgm\*"; DestDir: "{app}\NewData\audio\bgm"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\Cover Art Characters\characters\*"; DestDir: "{app}\NewData\img\characters"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\Cover Art Characters\faces\*"; DestDir: "{app}\NewData\img\faces"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\Cover Art Characters\pictures\*"; DestDir: "{app}\NewData\img\pictures"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\Cover Art Characters\sv_actors\*"; DestDir: "{app}\NewData\img\sv_actors"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\Essentials Add-On\BGM-OGG\*"; DestDir: "{app}\NewData\audio\bgm"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\Essentials Add-On\Facesets\*"; DestDir: "{app}\NewData\img\faces"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\Essentials Add-On\Tilesets\*"; DestDir: "{app}\NewData\img\tilesets"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\EternalDestiny\Characters\*"; DestDir: "{app}\NewData\img\characters"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\EternalDestiny\Facesets\*"; DestDir: "{app}\NewData\img\faces"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\EternalDestiny\Portraits\*"; DestDir: "{app}\NewData\img\pictures"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\ExtraAssets\2000bgm\*"; DestDir: "{app}\NewData\audio\bgm"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\ExtraAssets\pictures\*"; DestDir: "{app}\NewData\img\pictures"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\KadokawaPlugins\*"; DestDir: "{app}\NewData\js\plugins"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\RPG Maker Freebies\RPG Maker MV Free Resources\Graphics\animations\*"; DestDir: "{app}\NewData\img\animations"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\RPG Maker Freebies\RPG Maker MV Free Resources\Graphics\Characters\*"; DestDir: "{app}\NewData\img\characters"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\RPG Maker Freebies\RPG Maker MV Free Resources\Graphics\enemies\*"; DestDir: "{app}\NewData\img\enemies"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\RPG Maker Freebies\RPG Maker MV Free Resources\Graphics\Facesets\*"; DestDir: "{app}\NewData\img\faces"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\RPG Maker Freebies\RPG Maker MV Free Resources\Graphics\sv_actors\*"; DestDir: "{app}\NewData\img\sv_actors"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\TeamFortress2\BONUS-Portraits\Female\*"; DestDir: "{app}\NewData\img\pictures"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\TeamFortress2\BONUS-Portraits\Male\*"; DestDir: "{app}\NewData\img\pictures"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\TeamFortress2\Characters\*"; DestDir: "{app}\NewData\img\characters"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\UmiharaKawase\characters\*"; DestDir: "{app}\NewData\img\characters"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\UmiharaKawase\face\*"; DestDir: "{app}\NewData\img\faces"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\Additional\UmiharaKawase\portrait\*"; DestDir: "{app}\NewData\img\pictures"; Components: DLC\v2; Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension
И считай в перечисленном есть свои подпапки с файлами
Если не считать рекурсивной установки тут строчек умножится где то на 10
Темболее что потом файлы могут добавится
 

David.D.Rocco

Участник
Проверенный
Тогда наверное надо вот это добавить:
Flags: recursesubdirs createallsubdirs
 

Хамик

Старожил
Да мне для этих файлов:
а так не проще?
Код:
[files]
Source: "MV\dlc\*"; DestDir: "{app}\dlc"; Components: DLC\v2; Check: not exists; Flags: recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\*"; DestDir: "{app}\rtp"; Components: DLC\v2; Check: exists; Flags: recursesubdirs createallsubdirs sortfilesbyextension

[code]
function exists(): boolean;
begin
  Result := FileExists(ExpandConstant('{app}\dlc\') + ExtractFileName(CurrentFileName));
end;
 
Последнее редактирование:

Alexandr_57

Новичок
а так не проще?
Нет. В dlc ресурсы в безпорядочном виде. И если их копировать в rtp нужно точно соблюдать порядок поэтому уменьшить число строчек не выйдет
Есть идея вот так сделать:
Код:
Source: "{app}\NewData\img\characters\*"; DestDir: "{app}\NewData\img\characters"; Components: DLC\v2; Check: exists('MV\dlc\Additional\CodeOfPrincess\characters\*');   Flags: onlyifdoesntexist recursesubdirs createallsubdirs sortfilesbyextension


[code]
function exists(s1:string): boolean;
begin
  Result := FileExists(ExpandConstant(s1) + ExtractFileName(CurrentFileName));
end;
Но я если честно слабо верю что будет работать
 

David.D.Rocco

Участник
Проверенный
Но я если честно слабо верю что будет работать
так вообще работать не будет
если указаны флаги recursesubdirs createallsubdirs инно сам разберет файлы по папкам. не важно, где они лежат.

Код:
[files]
Source: "MV\dlc\*"; DestDir: "{app}\rtp"; Components: DLC\v2; Check: not exists; Flags: recursesubdirs createallsubdirs sortfilesbyextension
Source: "MV\dlc\*"; DestDir: "{app}\dlc"; Components: DLC\v2; Check: exists; Flags: recursesubdirs createallsubdirs sortfilesbyextension

[code]
function exists(): boolean;
begin
  Result := FileExists(ExpandConstant('{app}\dlc\') + ExtractFileName(CurrentFileName));
end;
 

Alexandr_57

Новичок
ExtractFileName() чисто имя же вернет
Вот как выглядит папка rtp в программе (NewData и есть папка с RTP)
2016-10-03 (8).png
Инсталятор разумеется не для стим версии. Просто у меня лицензия. Но роли не играет таккак отличий в папках нету
Я же говорю все по папкам разложено
Про установку знаю что сам разберет но вот про проверку она будет проверку делать чисто в {app}\dlc\ не учитывая подкаталоги
 

Alexandr_57

Новичок
Постойте. CurrentFileName вернет конечный путь и имя файла. Так не проще будет делать так
Код:
function exists(): boolean;
begin
  Result := FileExists(ExpandConstant(CurrentFileName));
end;
По идеи проверит существует ли файл куда его устанавливают или нет
Нет вариант не подойдет.
 
Последнее редактирование:

Хамик

Старожил
Нет вариант не подойдет.
а если так?
Код:
[files]
Source: "MV\dlc\Additional\CodeOfPrincess\characters\*"; DestDir: "{app}\NewData\img\characters"; Components: DLC\v2; Check: exists(ExpandConstant('{app}\OldData\img\characters')); Flags: sortfilesbyextension
Source: "MV\dlc\Additional\CodeOfPrincess\characters\*"; DestDir: "{app}\OldData\img\characters"; Components: DLC\v2; Check: not exists(ExpandConstant('{app}\OldData\img\characters')); Flags: sortfilesbyextension
Source: "MV\dlc\Additional\CodeOfPrincess\face\*"; DestDir: "{app}\NewData\img\faces"; Components: DLC\v2; Check: exists(ExpandConstant('{app}\OldData\img\faces')); Flags: sortfilesbyextension
Source: "MV\dlc\Additional\CodeOfPrincess\face\*"; DestDir: "{app}\OldData\img\faces"; Components: DLC\v2; Check: not exists(ExpandConstant('{app}\OldData\img\faces')); Flags: sortfilesbyextension
Source: "MV\dlc\Additional\CodeOfPrincess\picture\*"; DestDir: "{app}\NewData\img\pictures"; Check: exists(ExpandConstant('{app}\OldData\img\pictures')); Flags: sortfilesbyextension
Source: "MV\dlc\Additional\CodeOfPrincess\picture\*"; DestDir: "{app}\OldData\img\pictures"; Check: not exists(ExpandConstant('{app}\OldData\img\pictures')); Flags: sortfilesbyextension

[code]
function exists(s: string): boolean;
begin
  Result := FileExists(AddBackslash(s) +ExtractFileName(CurrentFileName));
end;
 

Alexandr_57

Новичок
Ну тогда проверка будет чисто в {app}\OldData\img\characters не включая подпапки. Мне нужно чтобы проверка учитывала подпапки.
Говорюж это надо через препроцесор делать. Там ведь можно делать проверку.
Вот если делать проверку прямо в секции [files] то тогда можно. Другое дело что как получить выходной путь и имя файла
А проверка вроде так можно
Код:
[Files]
#if FileExists(CurrentFileName)
Source: "MV\dlc\BaseResource_Compressed\*"; DestDir: "{app}\NewData"; Components: DLC\v2; Flags: recursesubdirs createallsubdirs sortfilesbyextension
#else
Source: "MV\dlc\BaseResource_Compressed\*"; DestDir: "{app}\dlc\BaseResource_Compressed"; Components: DLC\v2; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Но скорее всего он проверку только один раз выполнить для целой строчки
 

Alexandr_57

Новичок
Нет полная ерундень выйдет. Прийдется создавать дополнительное окно с выбором папки куда нужно будет устанавливать DLC
Ктонить может подсказать как это сделать?
Хотя конечно лучше проверка. Чтож прийдется писать несколько сотен строчек и делать без рекурсии
 
Последнее редактирование:

Хамик

Старожил
Нет полная ерундень выйдет
вот так попробуйте, только под себя подстройте папки, правда имеется баг: если в ваших файлах будет пустая папка, то словите ошибку. Решение еще не придумал:)
Код:
[Setup]
AppName=App
AppverName=App v1.0
DefaultDirName={pf}\App
OutputDir=.

[files]
Source: "dlc\*"; DestDir: "{app}\rtp"; Check: exists; Flags: recursesubdirs createallsubdirs sortfilesbyextension
Source: "dlc\*"; DestDir: "{app}\dlc"; Check: not exists; Flags: recursesubdirs createallsubdirs sortfilesbyextension

[code]
function exists(): boolean;
var
path, app : string;
begin
path := AddBackslash(ExtractFileDir(CurrentFileName))+ExtractFileName(CurrentFileName);
app := '{app}\rtp';
Delete(path, Pos(app, path), Length(app));
Result := FileExists(AddBackslash(ExpandConstant('{app}\dlc')) +path);
end;
 
Сверху