Inno设置-FileCopy在路径名中使用通配符

问题描述 投票:2回答:2

我正在尝试将所有数据库文件从以前的安装复制到具有新路径名的新安装。问题是安装程序将不知道数据库文件的名称,因此我正在尝试使用通配符。

我尝试使用TFileStream.Create(),但这是在搜索单个文件,例如“ * .mdb”,但我不断收到错误消息,指出找不到该文件。我也尝试使用FileCopy(),但它似乎只是失败而继续前进。我什至尝试使用Exec()通过命令行运行它,但它只会冻结安装。

我已经在网上搜索很长时间了,并阅读了很多文档。我只需要知道如何使用通配符来复制名称未知的文件。以下是我尝试过的示例。

TFileStream.Create()

Exec()

FileCopy()

    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('C:\Users\seang\Desktop\Old\*.mdb', 'C:\Users\seang\Desktop\New\*.mdb', True);
inno-setup wildcard pascal file-copying delphi
2个回答
5
投票

您需要使用 Exec('cmd.exe', 'COPY "C:\Users\seang\Desktop\Old\*.mdb" "C:\Users\seang\Desktop\New\*.mdb"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode); FindFirstFindNext遍历文件夹。您获得每个数据库名称,然后分别复制它。可以在Pascal(Delphi)中找到执行此操作的示例FindClose。在hereSupport Functions Reference部分的InnoSetup帮助文件中,还有一个使用它们的示例:

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调用中)查找正确的旧文件夹,并将计数行更改为将找到的每个文件复制到新文件夹中的块(使用[ C0]或FindFirst(以您喜欢的为准)。


2
投票

您稍加修改即可尝试使用命令行:

© www.soinside.com 2019 - 2024. All rights reserved.