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识别大括号扩展语法:
- 更新匹配模式生成方法:
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
- 修改
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
相关产品推荐
相关产品推荐

