如何在ADF中使用单个复制活动拷贝多格式文件并保留原有扩展名
ADF FTP到Azure存储拷贝保留原文件后缀解决方案
问题根因说明
你遇到的两类异常核心原因分别是:
- 所有文件后缀自动变为.txt:Sink端数据集默认指定了固定扩展名,或是选择「分隔符文本」格式后强制追加了.txt后缀,ADF会自动改写输出文件的名称规则
- 配置
item().name后取到文件夹名而非文件名:你当前的Get Metadata活动或者ForEach循环的遍历对象配置错误,遍历的是文件夹层级而非文件层级
具体修复步骤
步骤1:调整源端遍历配置
- 先添加
Get Metadata活动连接FTP源数据集,字段选择Child Items,必须勾选「仅列出文件」选项,过滤掉返回结果里的文件夹对象 - 后续添加
ForEach活动,输入项配置为@activity('你的Get Metadata活动名称').output.childItems,确保循环的每一个item都是单个文件对象
步骤2:调整Sink数据集配置
- Sink端优先选择「二进制格式」的数据集,不要绑定特定文本格式:
使用二进制数据集做拷贝时,ADF不会对文件内容、文件名做任何修改,1:1原样迁移,是跨存储拷贝多格式文件的最优选择
- 如果你必须使用特定格式的数据集,需要在拷贝活动的Sink配置块中,找到「文件名」字段,填入动态内容
@item().name,不要在数据集本身的配置里写死文件名 - 确认Sink端没有开启「统一添加文件后缀」「强制统一输出格式」这类额外配置
步骤3:验证拷贝活动配置
进入拷贝活动的「源」配置页,按需调整「递归」选项:
- 如果只拷贝源文件夹根目录下的文件,关闭递归即可
- 如果要拷贝所有子目录下的文件,开启递归,此时Sink端的文件名动态内容需要调整为
@item().relativePath,才能完整保留目录结构和原文件名
快速验证方法
可以先单独运行Get Metadata活动,查看输出的childItems列表,确认每一项都是文件、name字段是带原后缀的完整文件名,再运行整个管道即可。
内容的提问来源于stack exchange,提问作者kira_22
相关产品推荐
相关产品推荐

