微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Linux下的Ruby中不区分大小写打开一个文件

有没有办法打开一个文件在Linux下的Ruby不区分大小写? 例如,给定stringfoo.txt ,我可以打开文件FOO.txt ?

一种可能的方法是读取目录中的所有文件名,并手动search所需文件的列表,但我正在寻找更直接的方法

是否有可能为Windows 7和/或8创build不区分大小写的自定义区域设置?

Wcsstr不区分大小写

Windows如何处理不区分大小写的文件名和path?

不区分大小写在文件名linux中用“string”search文件

虽然你不能open大小写不敏感,你可以编写目录搜索你很简洁的建议。 例如

filename = Dir.glob('foo.txt',File::FNM_CASEFOLD).first if filename # use filename here else # no matching file end

请注意,虽然文档建议FNM_CASEFOLD不能与glob一起使用,但这看起来不正确或过时。

备择方案

如果您担心使用FNM_CASEFOLD则可以使用FNM_CASEFOLD几种方法

filename = Dir.glob('*').find { |f| f.downcase == 'foo.txt' }

或者写一个方法来为给定的文件名建立一个不区分大小写的glob:

def ci_glob(filename) glob = '' filename.each_char do |c| glob += c.downcase != c.upcase ? "[#{c.downcase}#{c.upcase}]" : c end glob end irb(main):024:0> ci_glob('foo.txt') => "[fF][oO][oO].[tT][xX][tT]"

然后你可以这样做:

filename = Dir.glob(ci_glob('foo.txt')).first

您可以使用带有FNM_CASEFOLD标志的FNM_CASEFOLD来获取除了大小写之外的与给定名称匹配的所有文件名的列表。 然后,您可以首先使用结果数组来获取任何结果,或者使用min_by获得与orignial的情况最接近的匹配结果。

def find_file(f) Dir.glob(f,File::FNM_CASEFOLD).min_by do |f2| f.chars.zip(f2.chars).count {|c1,c2| c1 != c2} end end system "touch foo.bar" system "touch Foo.Bar" Dir.glob("FOO.BAR",File::FNM_CASEFOLD) #=> ["foo.bar","Foo.Bar"] find_file("FOO.BAR") #=> ["Foo.Bar"]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐