You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails中Net::SFTP如何设置xlsx与csv文件的匹配模式?

解决net-sftp 4.0.0多文件后缀匹配问题

核心原因

net-sftp的sftp.dir.glob方法依赖Ruby原生的File.fnmatch规则,默认不支持正则表达式的分组语法(如(xlsx|csv)),也不支持bash风格的大括号扩展(如{xlsx,csv}),所以你之前尝试的模式都无法生效。

可行方案

方案一:启用大括号扩展支持

修改sftp.dir.glob的调用,添加File::FNM_EXTGLOB选项,让Ruby识别大括号扩展语法:

  1. 更新匹配模式生成方法:
def fetch_sftp_file_format
  ist_timezone = TZInfo::Timezone.get('Asia/Kolkata')
  current_date = Time.now.in_time_zone(ist_timezone).strftime('%Y_%m_%d')
  "*_#{current_date}.{xlsx,csv}"
end
  1. 修改sftp.dir.glob调用,传入扩展选项:
Net::SFTP.start(host, user, config) do |sftp|
  Rails.logger.info "Connected to sftp"
  # 新增第三个参数File::FNM_EXTGLOB
  sftp.dir.glob(@file_path, @file_regex, File::FNM_EXTGLOB) do |file|
    # 你的文件处理逻辑
  end
end

方案二:分别匹配后合并结果

如果不想修改glob选项,可以分别匹配两种后缀的文件,再合并去重:

Net::SFTP.start(host, user, config) do |sftp|
  Rails.logger.info "Connected to sftp"
  ist_timezone = TZInfo::Timezone.get('Asia/Kolkata')
  current_date = Time.now.in_time_zone(ist_timezone).strftime('%Y_%m_%d')
  
  # 定义两个单独的匹配模式
  xlsx_pattern = "*_#{current_date}.xlsx"
  csv_pattern = "*_#{current_date}.csv"
  
  # 获取所有匹配文件并去重
  matching_files = sftp.dir.glob(@file_path, xlsx_pattern) + sftp.dir.glob(@file_path, csv_pattern)
  matching_files.uniq! { |file| file.name }
  
  matching_files.each do |file|
    # 你的文件处理逻辑
  end
end

验证说明

  • 方案一更简洁,适合需要匹配多种后缀的场景;
  • 方案二兼容性更好,无需依赖特定的glob选项;
  • 两种方案都能在net-sftp 4.0.0版本下正常工作。

内容的提问来源于stack exchange,提问作者user23353243

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:42:23