Inno Setup的 - FileCopy使用通配符路径(Inno Setup - FileCo

2019-07-04 11:09发布

我想所有的数据库文件在先前安装复制到新安装的,它有一个新的路径。 问题是,安装程序将无法知道数据库文件的名称,所以我试图用通配符。

我试着用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);

Answer 1:

您需要使用FindFirstFindNext ,并FindClose通过文件夹进行迭代。 你得到的每个数据库的名称,然后将它单独复制。 这样做,在帕斯卡(德尔福)的例子可以发现在这里 。 还有在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调用),并更改计数到块拷贝发现到新文件夹(使用每个文件的行FileCopyTFileStream ,无论你喜欢)。



Answer 2:

如果你修改了一点你的命令行的尝试可以工作:

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


文章来源: Inno Setup - FileCopy use wildcard character in pathname