我想所有的数据库文件在先前安装复制到新安装的,它有一个新的路径。 问题是,安装程序将无法知道数据库文件的名称,所以我试图用通配符。
我试着用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);
您需要使用FindFirst
, FindNext
,并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
调用),并更改计数到块拷贝发现到新文件夹(使用每个文件的行FileCopy
或TFileStream
,无论你喜欢)。
如果你修改了一点你的命令行的尝试可以工作:
Exec('cmd.exe', '/c COPY "C:\Users\seang\Desktop\Old\*.mdb" "C:\Users\seang\Desktop\New"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);