【问题标题】:Inno Setup - FileCopy use wildcard character in pathnameInno Setup - FileCopy 在路径名中使用通配符
【发布时间】:2012-11-21 06:01:46
【问题描述】:

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

我尝试使用 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('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);

【问题讨论】:

标签: inno-setup wildcard pascal file-copying delphi


【解决方案1】:

您需要使用FindFirstFindNextFindClose 来遍历文件夹。您获取每个数据库名称,然后单独复制它。在 Pascal (Delphi) 中执行此操作的示例可以在 here 中找到。 InnoSetup 帮助文件中还有一个使用它们的示例,位于File System FunctionsSupport Functions Reference 部分:

// 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 调用中)的正确旧文件夹,并将计数的行更改为将找到的每个文件复制到新文件夹的块(使用FileCopyTFileStream,随你喜欢)。

【讨论】:

【解决方案2】:

如果你稍微修改一下你的命令行尝试就可以工作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多