FileTest.relative?

I

Intransition

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?
 
L

Luis Lavena

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


Is all that really necessary? My version may be too simplistic, but
surely there is more concise way to do this?

Your code is not contemplating drive letters.
 
B

Ben Bleything

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:

Pathname has both #absolute? and #relative?, as well as some other
nice methods for figuring out what a path means. Maybe look there?

Ben
 
K

Ken Bloom

Good point.


On Windows, a path without a drive letter that only starts in a single
backslash would be relative (becuase it's relative to the current drive
letter.) A double backslash would be an absolute UNC name.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,792
Messages
2,569,639
Members
45,353
Latest member
RogerDoger

Latest Threads

Top