代码之家  ›  专栏  ›  技术社区  ›  imgx64

在Linux下的Ruby中不敏感地打开一个文件箱

  •  13
  • imgx64  · 技术社区  · 15 年前

    有没有办法在Linux下的Ruby中不敏感地打开一个文件箱?例如,给定字符串 foo.txt ,我能打开文件吗 FOO.txt ?

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

    2 回复  |  直到 11 年前
        1
  •  18
  •   das-g DuXeN0N    11 年前

    虽然你不能 open 不区分大小写,您可以非常简洁地编写建议的目录搜索。例如

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

    注意,当 documentation suggests that FNM_CASEFOLD can't be used with glob 这似乎不正确或过时。

    选择

    如果你担心使用 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
    
        2
  •  1
  •   sepp2k    15 年前

    您可以将dir.glob与 FNM_CASEFOLD 获取与给定名称匹配的所有文件名(大小写除外)的列表的标志。你就可以用了 first 在结果数组上获取任何结果返回或使用 min_by 找一个最符合原版的。

    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"]