如何在两个TStringList中查找首个匹配项并修复循环不退出问题
问题根源
你现有代码的核心逻辑错误有两处:
- 内层循环的判断逻辑错误:你在内层循环每次和单个本地文件夹比对不匹配时,就直接标记
FlagFound=False并将当前文件夹加入待复制列表,没有等到遍历完所有本地文件夹确认无匹配再操作。如果当前导入文件夹和第1个本地文件夹不匹配、但和第2个匹配,你会先错误加一次待复制列表,再标记找到,逻辑完全颠倒。 - 复制操作的目标错误:你现在执行
TDirectory.Copy时复制的是整个chosenDirectory根路径,不是当前判断为需要复制的单个导入文件夹。
修复后代码
for N := 0 to ListFoldersImported.Count-1 do begin // 每次处理新的导入文件夹前,先初始化匹配标记为未找到 FlagFound := False; // 内层循环只做匹配校验,不做新增、赋值操作 for Y := 0 to ListFoldersLocalRepository.Count-1 do begin if MatchStr(ExtractFileName(ListFoldersImported[N]), ExtractFileName(ListFoldersLocalRepository[Y])) then begin FlagFound := True; Break; // 找到匹配直接跳出内层循环,处理下一个导入文件夹 end; end; // 内层循环全部跑完后,再判断是否需要复制 if not FlagFound then begin ListOfFoldersThatNeedsToBeCopied.Add(ListFoldersImported[N]); // 复制当前单个导入文件夹到本地仓库路径下,用系统方法拼接路径避免斜杠异常 TDirectory.Copy( ListFoldersImported[N], TPath.Combine(PathLocalRepo, ExtractFileName(ListFoldersImported[N])) ); end; end;
补充说明
- 如果你不需要保留
ListOfFoldersThatNeedsToBeCopied这个列表做后续其他处理,可以把新增列表的代码直接删掉 - 建议调用
TDirectory.Copy前先判断目标路径是否存在,避免偶发的IO异常
内容的提问来源于stack exchange,提问作者RedDot
相关产品推荐
相关产品推荐

