我正在尝试将以前安装中的所有数据库文件复制到具有新路径名的新安装。问题是安装程序不知道数据库文件的名称,所以我试图使用通配符。
我尝试使用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);
答案 0 :(得分:4)
您需要使用FindFirst
,FindNext
和FindClose
来遍历该文件夹。您获取每个数据库名称,然后单独复制它。可以在here找到在Pascal(Delphi)中执行此操作的示例。还有一个在InnoSetup帮助文件中使用它们的示例,位于Support Functions Reference
的{{1}}部分:
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
,无论您喜欢哪种方式。)
答案 1 :(得分:2)
如果稍微修改它,您的命令行尝试可以正常工作:
Exec('cmd.exe', '/c COPY "C:\Users\seang\Desktop\Old\*.mdb" "C:\Users\seang\Desktop\New"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);