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;
Вы можете изменить цикл выше, чтобы посмотреть в нужной старой папке для каждого *.mdb
(в FindFirst
вызов) и измените строку, которая считается на блок, который копирует каждый найденный файл в новую папку (используя либо FileCopy
или TFileStream
какой вы предпочитаете)
Ваша попытка командной строки может сработать, если вы немного ее измените:
Exec('cmd.exe', '/c COPY "C:\Users\seang\Desktop\Old\*.mdb" "C:\Users\seang\Desktop\New"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);