Ruby 怎么获取如 abc.tar.gz 文件的文件名 abc

fahchen · 2012年07月26日 · 最后由 zfbtianya 回复于 2013年09月23日 · 4470 次阅读

abc.txt 的这种会 File.basename(file,File.extname(file)) abc.tar.gz 文件名 abc abc.v1.tar.gz 文件名 abc.v1 后面两种怎么取正确啊?

帮你顶一下哈!

我也是新手,来个笨的 “abc.tar.gz".scan(/(\w+)./).frist.first

#2 楼 @feitian124 有局限,第三种不行

这种就得不到了 abc.v1.tar.gz 文件名 abc.v1

应该没法了吧 我觉得不用太执着,file.split(".").first 算了

只要有个表可以 match 出 extension filename,然后在源文件名基础上移除匹配到的 ext name,就可以了。应该有一些 gem 是可以通过文件的 ext name 来判断文件的 mimetype 的,楼主可以从这个地方入手看能不能抽离出一套文件扩展名总表。

a = %w{ tar gz txt }

def basename(file_name, arr)
  names = file_name.split('.')
  name = File.basename(names.shift)

  ts = names.select { |x| not arr.include? x }
  ts.empty? ? name : name + '.' + ts.join('.')
end

puts basename('abc.tar.gz', a)
puts basename('abc.v1.tar.gz', a)

代码应该可以再简洁的

另一个版本

a = %w{ .tar .gz .txt }
def basename(file_name, arr)
  file_name = File.basename file_name
  while(true)
    name = file_name.scan(/\.\w+$/).first
    arr.include?(name) ? file_name.gsub!(name, '') : break
  end

  file_name
end
puts basename('/User/abc.tar.gz', a)
puts basename('abc.v1.tar.gz', a)

File.basename("abc.tar.gz",".tar.gz")

需要 登录 后方可回复, 如果你还没有账号请 注册新账号