Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


vint56,
Цитата vint56:
у тебя случаем нет примера Переименование файлов не по маске а по определенному названию vo_ russian.spk на vo_english.spk в зависимости от выбранного компонента »
Не было пока ты не спросил вот тебе процедура
читать дальше »
Код: Выделить весь код
[Components]
Name: en; Description: Russian to English; Flags: exclusive
Name: ru; Description: English to Russian; Flags: exclusive

;[Files]
;Source: Folder\*; DestDir: {app}; Flags: recursesubdirs createallsubdirs onlyifdoesntexist


[code    ]
#define A = (Defined UNICODE) ? "W" : "A"

function MoveFile(lpExistingFileName, lpNewFileName: String): BOOL; external 'MoveFile{#A}@kernel32.dll stdcall';

procedure RenameFileChunks(const RootFolder, SourceFileChunk, DestFileChunk: String; const Recurse: Boolean);
var
    NewSearchPath, TempFileName: String;
    FindRec: TFindRec;
begin
    NewSearchPath := AddBackslash(RemoveBackslash(RootFolder));

    if FindFirst(NewSearchPath + '*.*', FindRec) then
    try
        repeat
        
            if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
            begin

                if Pos(SourceFileChunk, FindRec.Name) <> 0 then
                begin
                    TempFileName := FindRec.Name;
                    StringChange(TempFileName, SourceFileChunk, DestFileChunk);
                    MoveFile(NewSearchPath + FindRec.Name, NewSearchPath + TempFileName);
                end;
            end else
            if (FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY) and (FindRec.Name <> '.') and (FindRec.Name <> '..') then
              if Recurse then RenameFileChunks(NewSearchPath + FindRec.Name, SourceFileChunk, DestFileChunk, Recurse);
                  
        until not FindNext(FindRec);
    finally
        FindClose(FindRec);
    end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
var
    AppPath: String;
begin
    if CurStep = ssPostInstall then
    begin
        AppPath := ExpandConstant('{app}');
        MsgBox('Сейчас переименую', mbInformation, MB_OK);
        if IsComponentSelected('ru') then
          RenameFileChunks(AppPath, 'english', 'russian', True)
        
        if IsComponentSelected('en') then
          RenameFileChunks(AppPath, 'russian', 'english', True);
    end;
end;

прототип: procedure RenameFileChunks(const RootFolder, SourceFileChunk, DestFileChunk: String; const Recurse: Boolean);

где:
RootFolder - исходная папка с файлами и папками, где нужно переименовывать
SourceFileChunk - часть в имени файла которую нужно переименовать, в данном случае 'russian' в vo_ russian.spk
DestFileChunk - часть в имени файла в которую нужно переименовать - 'english'
Recurse - булев значение. Если True то будет искать в подкаталогах RootFolder-а, в противном случае только в RootFolder

вызываешь процедуру например на этапе ssPostInstall для соответсвующих компонентов, если они выбраны ( IsComponentSelected(...) ... )

==============================================================

tr011_tmn,
Цитата tr011_tmn:
Все верно? »
верно, слетит только папка Redist с её содержимым

Последний раз редактировалось Johny777, 14-08-2013 в 19:00. Причина: заменил глючную RenameFile на рабочую MoveFile (WinApi)

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:18, 14-08-2013 | #1014