From: Intransition Date: 2010-12-22T08:35:19+09:00 Subject: FileTest.relative? It seems FileTest lacks a `relative?` method (and conversely `absolute? `). I need such a method. I went to write one but found my self not 100% certain about it being cross-platform. I wrote: module FileTest module_function def relative?(path) /\A[\/\\]/ !~ File.expand_path(path) end end To put it in English, I expand the path and then simply check for a leading '/' or '\'. I noticed Pathname has a `relative?` method and I looked at it. It's seems a bit bulky: if File::ALT_SEPARATOR SEPARATOR_LIST = "#{Regexp.quote File::ALT_SEPARATOR} #{Regexp.quote File::SEPARATOR}" SEPARATOR_PAT = /[#{SEPARATOR_LIST}]/ else SEPARATOR_LIST = "#{Regexp.quote File::SEPARATOR}" SEPARATOR_PAT = /#{Regexp.quote File::SEPARATOR}/ end def relative? path = @path while r = chop_basename(path) path, basename = r end path == '' end def chop_basename(path) base = File.basename(path) if /\A#{SEPARATOR_PAT}?\z/o =~ base return nil else return path[0, path.rindex(base)], base end end private :chop_basename Is all that really necessary? My version may be too simplistic, but surely there is more concise way to do this?