type
TFileListRecord=record
SourceName: string;
SourceType: integer;
{0-文件夹
1-文件}
DirSearched: boolean;
{文件夹是否已经扫描过,用于获取文件列表的标志}
end;
......
FileCount: integer;
{复制文件的总数}
Files: array of TFileListRecord;
{文件列表}
......
//
// 获取源文件夹下需要安装的文件的列表...
procedure TForm5.GetFileList;
var
j: integer;
begin
//
// 初始化文件列表,将顶部文件夹入数组...
FileCount:=1;
setlength(Files,filecount);
files[0].SourceName:=s_DefaultDir+'QuickBurro';
files[0].SourceType:=0;
files[0].DirSearched:=false;
//
// 开始扫描每个未被扫描过的文件夹下的文件,直到所有文件夹都被扫描完成...
j:=GetDirIndex;
{得到一个未被扫描的文件夹的索引号}
while j>=0 do
begin
//
// 得到该文件夹下的文件列表...
GetDirFiles(j);
files[j].DirSearched:=true;
{设置为已扫描}
//
// 继续扫描下个文件夹...
j:=GetDirIndex;
{得到下一个未被扫描的文件夹的索引号}
end;
end;
//
// 得到一个未被扫描的文件夹的索引号的函数...
function TForm5.GetDirIndex(): integer;
var
i: integer;
begin
result:=-1;
for i:=0 to filecount-1 do
if (files[i].SourceType=0) and (not files[i].DirSearched) then
begin
result:=i;
break;
end;
end;
//
// 得到一个文件夹下的文件列表并将它们加入数组的过程...
procedure TForm5.GetDirFiles(aIndex: integer);
var
sr: TSearchRec;
j: integer;
begin
//
// 开始查找...
if FindFirst(files[aIndex].SourceName+'\*.*', faAnyFile, sr) = 0 then
begin
//
// 保存首个...
if (sr.name<>'.') and (sr.name<>'..') and (sr.Attr<>faVolumeID) then
begin
j:=filecount;
inc(filecount);
setlength(files,filecount);
files[j].SourceName:=files[aIndex].SourceName+'\'+sr.name;
//
// 假如是目录...
if sr.Attr=faDirectory then
begin
files[j].SourceType:=0;
files[j].DirSearched:=false;
end
//
// 假如是文件...
else
begin
files[j].SourceType:=1;
files[j].DirSearched:=true;
end;
end;
//
// 循环查找...
while FindNext(sr) = 0 do
begin
//
// 保存下个...
if (sr.name<>'.') and (sr.name<>'..') and (sr.Attr<>faVolumeID) then
begin
j:=filecount;
inc(filecount);
setlength(files,filecount);
files[j].SourceName:=files[aIndex].SourceName+'\'+sr.name;
//
// 假如是目录...
if sr.Attr=faDirectory then
begin
files[j].SourceType:=0;
files[j].DirSearched:=false;
end
//
// 假如是文件...
else
begin
files[j].SourceType:=1;
files[j].DirSearched:=true;
end;
end;
end;
//
// 结束查找...
SysUtils.FindClose(sr);
end;
end;