有没有办法打开一个文件在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] 举报,一经查实,本站将立刻删除。