Class Pathname
In: lib/pathname.rb
Parent: Object

Pathname

Pathname represents a pathname which locates a file in a filesystem. The pathname depends on OS: Unix, Windows, etc. Pathname library works with pathnames of local OS. However non-Unix pathnames are supported experimentally.

It does not represent the file itself. A Pathname can be relative or absolute. It‘s not until you try to reference the file that it even matters whether the file exists or not.

Pathname is immutable. It has no method for destructive update.

The value of this class is to manipulate file path information in a neater way than standard Ruby provides. The examples below demonstrate the difference. All functionality from File, FileTest, and some from Dir and FileUtils is included, in an unsurprising way. It is essentially a facade for all of these, and more.

Examples

Example 1: Using Pathname

  require 'pathname'
  p = Pathname.new("/usr/bin/ruby")
  size = p.size              # 27662
  isdir = p.directory?       # false
  dir  = p.dirname           # Pathname:/usr/bin
  base = p.basename          # Pathname:ruby
  dir, base = p.split        # [Pathname:/usr/bin, Pathname:ruby]
  data = p.read
  p.open { |f| _ }
  p.each_line { |line| _ }

Example 2: Using standard Ruby

  p = "/usr/bin/ruby"
  size = File.size(p)        # 27662
  isdir = File.directory?(p) # false
  dir  = File.dirname(p)     # "/usr/bin"
  base = File.basename(p)    # "ruby"
  dir, base = File.split(p)  # ["/usr/bin", "ruby"]
  data = File.read(p)
  File.open(p) { |f| _ }
  File.foreach(p) { |line| _ }

Example 3: Special features

  p1 = Pathname.new("/usr/lib")   # Pathname:/usr/lib
  p2 = p1 + "ruby/1.8"            # Pathname:/usr/lib/ruby/1.8
  p3 = p1.parent                  # Pathname:/usr
  p4 = p2.relative_path_from(p3)  # Pathname:lib/ruby/1.8
  pwd = Pathname.pwd              # Pathname:/home/gavin
  pwd.absolute?                   # true
  p5 = Pathname.new "."           # Pathname:.
  p5 = p5 + "music/../articles"   # Pathname:music/../articles
  p5.cleanpath                    # Pathname:articles
  p5.realpath                     # Pathname:/home/gavin/articles
  p5.children                     # [Pathname:/home/gavin/articles/linux, ...]

Breakdown of functionality

Core methods

These methods are effectively manipulating a String, because that‘s all a path is. Except for mountpoint?, children, and realpath, they don‘t access the filesystem.

File status predicate methods

These methods are a facade for FileTest:

  • blockdev?
  • chardev?
  • directory?
  • executable?
  • executable_real?
  • exist?
  • file?
  • grpowned?
  • owned?
  • pipe?
  • readable?
  • world_readable?
  • readable_real?
  • setgid?
  • setuid?
  • size
  • size?
  • socket?
  • sticky?
  • symlink?
  • writable?
  • world_writable?
  • writable_real?
  • zero?

File property and manipulation methods

These methods are a facade for File:

Directory methods

These methods are a facade for Dir:

IO

These methods are a facade for IO:

  • each_line(*args, &block)
  • read(*args)
  • readlines(*args)
  • sysopen(*args)

Utilities

These methods are a mixture of Find, FileUtils, and others:

Method documentation

As the above section shows, most of the methods in Pathname are facades. The documentation for these methods generally just says, for instance, "See FileTest.writable?", as you should be familiar with the original method anyway, and its documentation (e.g. through ri) will contain more information. In some cases, a brief description will follow.

Methods

+   <=>   ==   ===   TO_PATH   absolute?   ascend   atime   basename   blockdev?   chardev?   chdir   children   chmod   chown   chroot   cleanpath   ctime   delete   descend   dir_foreach   directory?   dirname   each_entry   each_filename   each_line   entries   eql?   executable?   executable_real?   exist?   expand_path   extname   file?   find   fnmatch   fnmatch?   foreach   foreachline   freeze   ftype   getwd   glob   grpowned?   join   lchmod   lchown   link   lstat   make_link   make_symlink   mkdir   mkpath   mountpoint?   mtime   new   open   opendir   owned?   parent   pipe?   read   readable?   readable_real?   readlines   readlink   realpath   relative?   relative_path_from   rename   rmdir   rmtree   root?   setgid?   setuid?   size   size?   socket?   split   stat   sticky?   sub   symlink   symlink?   sysopen   taint   to_s   truncate   unlink   untaint   utime   world_readable?   world_writable?   writable?   writable_real?   zero?  

Constants

SEPARATOR_PAT = /[#{Regexp.quote File::ALT_SEPARATOR}#{Regexp.quote File::SEPARATOR}]/
SEPARATOR_PAT = /#{Regexp.quote File::SEPARATOR}/

External Aliases

getwd -> pwd

Public Class methods

See Dir.getwd. Returns the current working directory as a Pathname.

See Dir.glob. Returns or yields Pathname objects.

Create a Pathname object from the given String (or String-like object). If path contains a NUL character (\0), an ArgumentError is raised.

Public Instance methods

Pathname#+ appends a pathname fragment to this one to produce a new Pathname object.

  p1 = Pathname.new("/usr")      # Pathname:/usr
  p2 = p1 + "bin/ruby"           # Pathname:/usr/bin/ruby
  p3 = p1 + "/etc/passwd"        # Pathname:/etc/passwd

This method doesn‘t access the file system; it is pure string manipulation.

Provides for comparing pathnames, case-sensitively.

Compare this pathname with other. The comparison is string-based. Be aware that two different paths (foo.txt and ./foo.txt) can refer to the same file.

===(other)

Alias for #==

TO_PATH()

Alias for to_s

Predicate method for testing whether a path is absolute. It returns true if the pathname begins with a slash.

Iterates over and yields a new Pathname object for each element in the given path in ascending order.

 Pathname.new('/path/to/some/file.rb').ascend {|v| p v}
    #<Pathname:/path/to/some/file.rb>
    #<Pathname:/path/to/some>
    #<Pathname:/path/to>
    #<Pathname:/path>
    #<Pathname:/>

 Pathname.new('path/to/some/file.rb').ascend {|v| p v}
    #<Pathname:path/to/some/file.rb>
    #<Pathname:path/to/some>
    #<Pathname:path/to>
    #<Pathname:path>

It doesn‘t access actual filesystem.

This method is available since 1.8.5.

See File.atime. Returns last access time.

See File.basename. Returns the last component of the path.

See FileTest.blockdev?.

See FileTest.chardev?.

Pathname#chdir is obsoleted at 1.8.1.

Returns the children of the directory (files and subdirectories, not recursive) as an array of Pathname objects. By default, the returned pathnames will have enough information to access the files. If you set with_directory to false, then the returned pathnames will contain the filename only.

For example:

  p = Pathname("/usr/lib/ruby/1.8")
  p.children
      # -> [ Pathname:/usr/lib/ruby/1.8/English.rb,
             Pathname:/usr/lib/ruby/1.8/Env.rb,
             Pathname:/usr/lib/ruby/1.8/abbrev.rb, ... ]
  p.children(false)
      # -> [ Pathname:English.rb, Pathname:Env.rb, Pathname:abbrev.rb, ... ]

Note that the result never contain the entries . and .. in the directory because they are not children.

This method has existed since 1.8.1.

See File.chmod. Changes permissions.

See File.chown. Change owner and group of file.

Pathname#chroot is obsoleted at 1.8.1.

Returns clean pathname of self with consecutive slashes and useless dots removed. The filesystem is not accessed.

If consider_symlink is true, then a more conservative algorithm is used to avoid breaking symbolic linkages. This may retain more .. entries than absolutely necessary, but without accessing the filesystem, this can‘t be avoided. See realpath.

See File.ctime. Returns last (directory entry, not file) change time.

delete()

Alias for unlink

Iterates over and yields a new Pathname object for each element in the given path in descending order.

 Pathname.new('/path/to/some/file.rb').descend {|v| p v}
    #<Pathname:/>
    #<Pathname:/path>
    #<Pathname:/path/to>
    #<Pathname:/path/to/some>
    #<Pathname:/path/to/some/file.rb>

 Pathname.new('path/to/some/file.rb').descend {|v| p v}
    #<Pathname:path>
    #<Pathname:path/to>
    #<Pathname:path/to/some>
    #<Pathname:path/to/some/file.rb>

It doesn‘t access actual filesystem.

This method is available since 1.8.5.

See FileTest.directory?.

See File.dirname. Returns all but the last component of the path.

Iterates over the entries (files and subdirectories) in the directory. It yields a Pathname object for each entry.

This method has existed since 1.8.1.

Iterates over each component of the path.

  Pathname.new("/usr/bin/ruby").each_filename {|filename| ... }
    # yields "usr", "bin", and "ruby".

each_line iterates over the line in the file. It yields a String object for each line.

This method has existed since 1.8.1.

Return the entries (files and subdirectories) in the directory, each as a Pathname object.

eql?(other)

Alias for #==

See FileTest.executable?.

See FileTest.executable_real?.

See FileTest.exist?.

See File.extname. Returns the file‘s extension.

See FileTest.file?.

Pathname#find is an iterator to traverse a directory tree in a depth first manner. It yields a Pathname for each file under "this" directory.

Since it is implemented by find.rb, Find.prune can be used to control the traverse.

If self is ., yielded pathnames begin with a filename in the current directory, not ./.

See File.fnmatch. Return true if the receiver matches the given pattern.

This method is obsoleted at 1.8.1. Use each_line or each_entry.

See File.ftype. Returns "type" of file ("file", "directory", etc).

See FileTest.grpowned?.

Pathname#join joins pathnames.

path0.join(path1, …, pathN) is the same as path0 + path1 + … + pathN.

Pathname#link is confusing and obsoleted because the receiver/argument order is inverted to corresponding system call.

See File.link. Creates a hard link.

See File.symlink. Creates a symbolic link.

See Dir.mkdir. Create the referenced directory.

See FileUtils.mkpath. Creates a full path, including any intermediate directories that don‘t yet exist.

mountpoint? returns true if self points to a mountpoint.

See File.mtime. Returns last modification time.

See File.open. Opens the file for reading or writing.

See FileTest.owned?.

parent returns the parent directory.

This is same as self + ’..’.

See FileTest.pipe?.

See IO.read. Returns all the bytes from the file, or the first N if specified.

See FileTest.readable?.

See FileTest.readable_real?.

See IO.readlines. Returns all the lines from the file.

See File.readlink. Read symbolic link.

Returns a real (absolute) pathname of self in the actual filesystem. The real pathname doesn‘t contain symlinks or useless dots.

No arguments should be given; the old behaviour is obsoleted.

The opposite of absolute?

relative_path_from returns a relative path from the argument to the receiver. If self is absolute, the argument must be absolute too. If self is relative, the argument must be relative too.

relative_path_from doesn‘t access the filesystem. It assumes no symlinks.

ArgumentError is raised when it cannot find a relative path.

This method has existed since 1.8.1.

See File.rename. Rename the file.

See Dir.rmdir. Remove the referenced directory.

See FileUtils.rm_r. Deletes a directory and all beneath it.

root? is a predicate for root directories. I.e. it returns true if the pathname consists of consecutive slashes.

It doesn‘t access actual filesystem. So it may return false for some pathnames which points to roots such as /usr/...

See FileTest.setgid?.

See FileTest.setuid?.

See FileTest.socket?.

See File.split. Returns the dirname and the basename in an Array.

See File.stat. Returns a File::Stat object.

See FileTest.sticky?.

Return a pathname which is substituted by String#sub.

Pathname#symlink is confusing and obsoleted because the receiver/argument order is inverted to corresponding system call.

See FileTest.symlink?.

Return the path as a String.

See File.truncate. Truncate the file to length bytes.

Removes a file or directory, using File.unlink or Dir.unlink as necessary.

See File.utime. Update the access and modification times.

See FileTest.world_readable?.

See FileTest.world_writable?.

See FileTest.writable?.

See FileTest.writable_real?.

See FileTest.zero?.

[Validate]

ruby-doc.org is a service of James Britt and Neurogami, a Ruby application development company in Phoenix, AZ.

Documentation content on ruby-doc.org is provided by remarkable members of the Ruby community.

For more information on the Ruby programming language, visit ruby-lang.org.

Want to help improve Ruby's API docs? See Ruby Documentation Guidelines.