Delphi如何在未知文件名时仅复制目录中的PDF文件?
如何批量复制目录中的PDF文件(未知文件名情况下)
看来你之前是针对单个已知文件名的文件用CopyFile来复制,现在要批量处理未知文件名的PDF对吧?我给你整理了一个Delphi下的实现方案,直接就能用:
核心思路
因为不知道具体文件名,我们需要先遍历目标目录的所有文件,筛选出后缀为.pdf(不区分大小写)的文件,再逐个调用CopyFile完成复制。
完整实现代码
procedure CopyAllPDFs(const SourceDir, DestDir: string); var SearchRec: TSearchRec; SourcePath, DestPath: string; begin // 先确保目标目录存在,不存在就创建 if not DirectoryExists(DestDir) then ForceDirectories(DestDir); // 开始遍历源目录下的所有文件 if FindFirst(IncludeTrailingPathDelimiter(SourceDir) + '*.*', faAnyFile, SearchRec) = 0 then begin try repeat // 跳过目录和特殊的.、..文件夹 if (SearchRec.Attr and faDirectory) = 0 then begin // 不区分大小写检查文件后缀是否为PDF if SameText(ExtractFileExt(SearchRec.Name), '.pdf') then begin // 拼接完整的源文件路径和目标文件路径 SourcePath := IncludeTrailingPathDelimiter(SourceDir) + SearchRec.Name; DestPath := IncludeTrailingPathDelimiter(DestDir) + SearchRec.Name; // 执行复制操作,第三个参数为true表示覆盖已存在的同名文件 if not CopyFile(PChar(SourcePath), PChar(DestPath), True) then begin // 这里可以根据需求替换成日志记录或其他错误处理逻辑 ShowMessage('复制失败:' + SourcePath); end; end; end; until FindNext(SearchRec) <> 0; finally // 一定要记得关闭搜索句柄,避免资源泄漏 FindClose(SearchRec); end; end; end;
调用示例(适配你的原有路径)
把这个函数集成到你的代码里,直接传入你的源目录和目标目录即可:
var SourceDir, DestDir: string; begin // 源目录:对应你原来的obPath.CaseTmpPath + '\' + currentCase.patientCase SourceDir := obPath.CaseTmpPath + '\' + currentCase.patientCase; // 目标目录:对应你原来的obPath.ServerData + currentCase.patientCase DestDir := obPath.ServerData + currentCase.patientCase; // 执行批量PDF复制 CopyAllPDFs(SourceDir, DestDir); end;
额外说明
- 大小写兼容:用
SameText来比较后缀,不管是.pdf还是.PDF都能被筛选到 - 目录创建:
ForceDirectories会自动创建多级目录,不用担心目标目录不存在的问题 - 错误处理:如果复制失败(比如权限不足、文件被占用),会弹出提示,你可以根据实际需求改成日志记录等更友好的处理方式
- 递归复制(可选):如果需要复制子目录里的PDF,可以给函数加上递归逻辑,当遍历到子目录时再次调用
CopyAllPDFs即可
内容的提问来源于stack exchange,提问作者Nevermore
相关产品推荐
相关产品推荐

