Inno Setup - FileCopy использует подстановочный знак в имени пути

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

Я пытался использовать TFileStream.Create(), но это был поиск одного файла, такого как "*.mdb", и я продолжал получать сообщение о том, что не может найти этот файл. Я также попытался с помощью FileCopy(), но, похоже, просто не удается и двигаться дальше. Я даже пытался использовать Exec() для запуска через командную строку, но это просто остановило бы установку.

Я долго искал в Интернете ответ и прочитал много документации. Мне просто нужно знать, как я могу использовать подстановочный знак для копирования файлов с неизвестными именами. Ниже приведены примеры того, что я пробовал.

TFileStream.Create ()

    OldDBs := 'C:\Users\seang\Desktop\Old\*.mdb';
    NewDBs := 'C:\Users\seang\Desktop\New\*.mdb';
    SourceDB:= TFileStream.Create(OldDBs, fmOpenRead);
    DestDB:= TFileStream.Create(NewDBs, fmCreate);
    DestDB.CopyFrom(SourceDB, SourceDB.Size);
    SourceDB.Free;
    DestDB.Free;

FileCopy ()

    FileCopy('C:\Users\seang\Desktop\Old\*.mdb', 'C:\Users\seang\Desktop\New\*.mdb', True);

Командная строка

    Exec('cmd.exe', 'COPY "C:\Users\seang\Desktop\Old\*.mdb" "C:\Users\seang\Desktop\New\*.mdb"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);

2 ответа

Решение

Вам нужно использовать FindFirst, FindNext, а также FindClose перебирать папку. Вы получаете каждое имя базы данных, а затем копируете его отдельно. Пример этого в Паскале (Delphi) можно найти здесь. Есть также пример использования их в файле справки InnoSetup, в Support Functions Reference раздел на File System Functions:

// This example counts all of the files (not folders) in the System directory.
var
  FilesFound: Integer;
  FindRec: TFindRec;
begin
  FilesFound := 0;
  if FindFirst(ExpandConstant('{sys}\*'), FindRec) then begin
    try
      repeat
        // Don't count directories
        if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
          FilesFound := FilesFound + 1;
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
  end;
  MsgBox(IntToStr(FilesFound) + ' files found in the System directory.',
    mbInformation, MB_OK);
end;

Вы можете изменить цикл выше, чтобы посмотреть в нужной старой папке для каждого *.mdbFindFirst вызов) и измените строку, которая считается на блок, который копирует каждый найденный файл в новую папку (используя либо FileCopy или TFileStreamкакой вы предпочитаете)

Ваша попытка командной строки может сработать, если вы немного ее измените:

Exec('cmd.exe', '/c COPY "C:\Users\seang\Desktop\Old\*.mdb" "C:\Users\seang\Desktop\New"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
Другие вопросы по тегам