Class: Pathname
| Relationships & Source Files | |
| Inherits: | Object | 
| Defined in: | ext/pathname/lib/pathname.rb, ext/pathname/pathname.c, ext/pathname/lib/pathname.rb, ext/pathname/lib/pathname.rb, ext/pathname/lib/pathname.rb | 
Overview
Pathname represents the name of a file or directory on the filesystem, but not the file itself.
The pathname depends on the Operating System: Unix, Windows, etc. This library works with pathnames of local OS, however non-Unix pathnames are supported experimentally.
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 goal 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'
pn = Pathname.new("/usr/bin/ruby")
size = pn.size              # 27662
isdir = pn.directory?       # false
dir  = pn.dirname           # Pathname:/usr/bin
base = pn.basename          # Pathname:ruby
dir, base = pn.split        # [Pathname:/usr/bin, Pathname:ruby]
data = pn.read
pn.open { |f| _ }
pn.each_line { |line| _ }Example 2: Using standard Ruby
pn = "/usr/bin/ruby"
size = File.size(pn)        # 27662
isdir = File.directory?(pn) # false
dir  = File.dirname(pn)     # "/usr/bin"
base = File.basename(pn)    # "ruby"
dir, base = File.split(pn)  # ["/usr/bin", "ruby"]
data = File.read(pn)
File.open(pn) { |f| _ }
File.foreach(pn) { |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. None of these access the file system except for #mountpoint?, #children, #each_child, #realdirpath and #realpath.
- 
+ 
File status predicate methods
These methods are a facade for FileTest:
File property and manipulation methods
These methods are a facade for File:
- 
#chmod(mode) 
- 
#lchmod(mode) 
- 
#chown(owner, group) 
- 
#lchown(owner, group) 
- 
#fnmatch(pattern, *args) 
- 
#fnmatch?(pattern, *args) 
- 
#make_link(old) 
- 
#open(*args, &block) 
- 
#rename(to) 
- 
#make_symlink(old) 
- 
#truncate(length) 
- 
#utime(atime, mtime) 
- 
#lutime(atime, mtime) 
- 
#basename(*args) 
- 
#expand_path(*args) 
Directory methods
These methods are a facade for Dir:
IO
These methods are a facade for IO:
- 
#each_line(*args, &block) 
- 
#read(*args) 
- 
#binread(*args) 
- 
#readlines(*args) 
- 
#sysopen(*args) 
- 
#write(*args) 
- 
#binwrite(*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.
Constant Summary
- 
    ABSOLUTE_PATH =
    private
    Internal use only
    
 # File 'ext/pathname/lib/pathname.rb', line 41/\A#{SEPARATOR_PAT}/o
- 
    SAME_PATHS =
    Internal use only
    
 # File 'ext/pathname/lib/pathname.rb', line 24if File::FNM_SYSCASE.nonzero? # Avoid #zero? here because #casecmp can return nil. proc {|a, b| a.casecmp(b) == 0} else proc {|a, b| a == b} end 
- 
    SEPARATOR_LIST =
    Internal use only
    
 # File 'ext/pathname/lib/pathname.rb', line 33"#{Regexp.quote File::SEPARATOR}"
- 
    SEPARATOR_PAT =
    Internal use only
    
 # File 'ext/pathname/lib/pathname.rb', line 34/#{Regexp.quote File::SEPARATOR}/
- 
    TO_PATH =
    Internal use only
    # File 'ext/pathname/lib/pathname.rb', line 22to_path is implemented so Pathnameobjects are usable withFile.open, etc.:to_path 
- 
    VERSION =
    
 # File 'ext/pathname/lib/pathname.rb', line 17"0.4.0"
Class Method Summary
- 
    
      .getwd  
    
    Alias for .pwd. 
- 
    
      .glob(*args)  
    
    Returns or yields Pathnameobjects.
- 
    
      .mktmpdir  
    
    Creates a tmp directory and wraps the returned path in a Pathnameobject.
- 
    
      .new(arg)  
    
    constructor
    Create a Pathnameobject from the given String (or String-like object).
- 
    
      .pwd  
      (also: .getwd)
    
    Returns the current working directory as a Pathname.
Instance Attribute Summary
- 
    
      #absolute?  ⇒ Boolean 
    
    readonly
    Predicate method for testing whether a path is absolute. 
- 
    
      #blockdev?  ⇒ Boolean 
    
    readonly
    See FileTest.blockdev?.
- 
    
      #chardev?  ⇒ Boolean 
    
    readonly
    See FileTest.chardev?.
- 
    
      #directory?  ⇒ Boolean 
    
    readonly
    See FileTest.directory?.
- 
    
      #empty?  ⇒ Boolean 
    
    readonly
    Tests the file is empty. 
- 
    
      #executable?  ⇒ Boolean 
    
    readonly
    See FileTest.executable?.
- 
    
      #executable_real?  ⇒ Boolean 
    
    readonly
    See FileTest.executable_real?.
- 
    
      #exist?  ⇒ Boolean 
    
    readonly
    See FileTest.exist?.
- 
    
      #file?  ⇒ Boolean 
    
    readonly
    See FileTest.file?.
- 
    
      #grpowned?  ⇒ Boolean 
    
    readonly
    See FileTest.grpowned?.
- 
    
      #mountpoint?  ⇒ Boolean 
    
    readonly
    Returns trueifselfpoints to a mountpoint.
- 
    
      #owned?  ⇒ Boolean 
    
    readonly
    See FileTest.owned?.
- 
    
      #pipe?  ⇒ Boolean 
    
    readonly
    See FileTest.pipe?.
- 
    
      #readable?  ⇒ Boolean 
    
    readonly
    See FileTest.readable?.
- 
    
      #readable_real?  ⇒ Boolean 
    
    readonly
    See FileTest.readable_real?.
- 
    
      #relative?  ⇒ Boolean 
    
    readonly
    The opposite of #absolute? 
- 
    
      #root?  ⇒ Boolean 
    
    readonly
    Predicate method for root directories. 
- 
    
      #setgid?  ⇒ Boolean 
    
    readonly
    See FileTest.setgid?.
- 
    
      #setuid?  ⇒ Boolean 
    
    readonly
    See FileTest.setuid?.
- 
    
      #size  
    
    readonly
    See FileTest.size.
- 
    
      #size?  ⇒ Boolean 
    
    readonly
    See FileTest.size?.
- 
    
      #socket?  ⇒ Boolean 
    
    readonly
    See FileTest.socket?.
- 
    
      #sticky?  ⇒ Boolean 
    
    readonly
    See FileTest.sticky?.
- 
    
      #symlink?  ⇒ Boolean 
    
    readonly
    See FileTest.symlink?.
- 
    
      #world_readable?  ⇒ Boolean 
    
    readonly
    See FileTest.world_readable?.
- 
    
      #world_writable?  ⇒ Boolean 
    
    readonly
    See FileTest.world_writable?.
- 
    
      #writable?  ⇒ Boolean 
    
    readonly
    See FileTest.writable?.
- 
    
      #writable_real?  ⇒ Boolean 
    
    readonly
    See FileTest.writable_real?.
- 
    
      #zero?  ⇒ Boolean 
    
    readonly
    See FileTest.zero?.
Instance Method Summary
- 
    
      #+(other)  
      (also: #/)
    
    Appends a pathname fragment to selfto produce a newPathnameobject.
- 
    
      #/(other)  
    
    Alias for #+. 
- 
    
      #<=>(other)  
    
    Provides a case-sensitive comparison operator for pathnames. 
- 
    
      #==(other)  
      (also: #===, #eql?)
    
    Compare this pathname with other.
- 
    
      #===(other)  
    
    Alias for #==. 
- 
    
      #ascend {|_self| ... } 
    
    Iterates over and yields a new Pathnameobject for each element in the given path in ascending order.
- 
    
      #atime  ⇒ Time 
    
    Returns the last access time for the file. 
- 
    
      #basename(*args)  
    
    Returns the last component of the path. 
- 
    
      #binread([length [, offset]])  ⇒ String 
    
    Returns all the bytes from the file, or the first Nif specified.
- 
    
      #binwrite(string, [offset])  ⇒ Fixnum 
    
    Writes contentsto the file, opening it in binary mode.
- 
    
      #birthtime  ⇒ Time 
    
    Returns the birth time for the file. 
- 
    
      #children(with_directory = true)  
    
    Returns the children of the directory (files and subdirectories, not recursive) as an array of Pathnameobjects.
- 
    
      #chmod(mode_int)  ⇒ Integer 
    
    Changes file permissions. 
- 
    
      #chown(owner_int, group_int)  ⇒ Integer 
    
    Change owner and group of the file. 
- 
    
      #cleanpath(consider_symlink = false)  
    
    Returns clean pathname of selfwith consecutive slashes and useless dots removed.
- 
    
      #ctime  ⇒ Time 
    
    Returns the last change time, using directory information, not the file itself. 
- 
    
      #delete  
      (also: #unlink)
    
    Removes a file or directory, using File.unlinkifselfis a file, orDir.unlinkas necessary.
- 
    
      #descend  
    
    Iterates over and yields a new Pathnameobject for each element in the given path in descending order.
- 
    
      #dirname  
    
    Returns all but the last component of the path. 
- 
    
      #each_child(with_directory = true, &b)  
    
    Iterates over the children of the directory (files and subdirectories, not recursive). 
- 
    
      #each_entry  
    
    Iterates over the entries (files and subdirectories) in the directory, yielding a Pathnameobject for each entry.
- 
    
      #each_filename  
    
    Iterates over each component of the path. 
- 
    
      #each_line {|line| ... } 
    
    Iterates over each line in the file and yields a String object for each. 
- 
    
      #entries  
    
    Return the entries (files and subdirectories) in the directory, each as a Pathnameobject.
- 
    
      #eql?(other)  
    
    Alias for #==. 
- 
    
      #expand_path(*args)  
    
    Returns the absolute path for the file. 
- 
    
      #extname  
    
    Returns the file’s extension. 
- 
    
      #find(ignore_error: true)  
    
    Iterates over the directory tree in a depth first manner, yielding a Pathnamefor each file under “this” directory.
- 
    
      #fnmatch(pattern, [flags])  ⇒ Boolean 
      (also: #fnmatch?)
    
    Return trueif the receiver matches the given pattern.
- 
    
      #fnmatch?(pattern, [flags])  ⇒ Boolean 
    
    Alias for #fnmatch. 
- 
    
      #freeze  ⇒ Object 
    
    Freezes this Pathname.
- 
    
      #ftype  ⇒ String 
    
    Returns “type” of file (“file”, “directory”, etc). 
- 
    
      #glob(*args)  
    
    Returns or yields Pathnameobjects.
- 
    
      #join(*args)  
    
    Joins the given pathnames onto selfto create a newPathnameobject.
- 
    
      #lchmod(mode_int)  ⇒ Integer 
    
    Same as #chmod, but does not follow symbolic links. 
- 
    
      #lchown(owner_int, group_int)  ⇒ Integer 
    
    Same as #chown, but does not follow symbolic links. 
- 
    
      #lstat  
    
    See File.lstat.
- 
    
      #lutime(atime, mtime)  
    
    Update the access and modification times of the file. 
- 
    
      #make_link(old)  
    
    Creates a hard link at pathname. 
- 
    
      #make_symlink(old)  
    
    Creates a symbolic link. 
- 
    
      #mkdir(*args)  
    
    Create the referenced directory. 
- 
    
      #mkpath(mode: nil)  
    
    Creates a full path, including any intermediate directories that don’t yet exist. 
- 
    
      #mtime  ⇒ Time 
    
    Returns the last modified time of the file. 
- 
    
      #open  
    
    Opens the file for reading or writing. 
- 
    
      #opendir  
    
    Opens the referenced directory. 
- 
    
      #parent  
    
    Returns the parent directory. 
- 
    
      #read([length [, offset]])  ⇒ String 
    
    Returns all data from the file, or the first Nbytes if specified.
- 
    
      #readlines(sep=$/ [, open_args])  ⇒ Array 
    
    Returns all the lines from the file. 
- 
    
      #readlink  
    
    Read symbolic link. 
- 
    
      #realdirpath(*args)  
    
    Returns the real (absolute) pathname of selfin the actual filesystem.
- 
    
      #realpath(*args)  
    
    Returns the real (absolute) pathname for selfin the actual filesystem.
- 
    
      #relative_path_from(base_directory)  
    
    Returns a relative path from the given base_directoryto the receiver.
- 
    
      #rename(to)  
    
    Rename the file. 
- 
    
      #rmdir  
    
    Remove the referenced directory. 
- 
    
      #rmtree(noop: nil, verbose: nil, secure: nil)  
    
    Recursively deletes a directory, including all directories beneath it. 
- #split
- 
    
      #stat  
    
    Returns a File::Statobject.
- 
    
      #sub(*args)  
    
    Return a pathname which is substituted by String#sub.
- 
    
      #sub_ext(repl)  
    
    Return a pathname with repladded as a suffix to the basename.
- 
    
      #sysopen([mode, [perm]])  ⇒ Fixnum 
    
    See IO.sysopen.
- 
    
      #to_path  ⇒ String 
    
    Alias for #to_s. 
- 
    
      #to_s  ⇒ String 
      (also: #to_path)
    
    Return the path as a String. 
- 
    
      #truncate(length)  
    
    Truncates the file to lengthbytes.
- 
    
      #unlink  
    
    Alias for #delete. 
- 
    
      #utime(atime, mtime)  
    
    Update the access and modification times of the file. 
- 
    
      #write(string, [offset])  ⇒ Fixnum 
    
    Writes contentsto the file.
- #hash Internal use only
- #inspect Internal use only
- 
    
      #add_trailing_separator(path)  
    
    private
    Internal use only
    add_trailing_separator(path) -> path. 
- 
    
      #chop_basename(path)  
    
    private
    Internal use only
    chop_basename(path) -> [pre-basename, basename] or nil. 
- 
    
      #cleanpath_aggressive  
    
    private
    Internal use only
    Clean the path simply by resolving and removing excess .and..entries.
- #cleanpath_conservative private Internal use only
- #del_trailing_separator(path) private Internal use only
- 
    
      #has_trailing_separator?(path)  ⇒ Boolean 
    
    private
    Internal use only
    has_trailing_separator?(path) -> bool. 
- 
    
      #plus(path1, path2)  
    
    private
    Internal use only
    -> path # :nodoc: 
- #prepend_prefix(prefix, relpath) private Internal use only
- 
    
      #split_names(path)  
    
    private
    Internal use only
    split_names(path) -> prefix, [name, …]. 
Constructor Details
.new(arg)
Create a Pathname object from the given String (or String-like object). If path contains a NULL character (\0), an ArgumentError is raised.
# File 'ext/pathname/pathname.c', line 96
static VALUE
path_initialize(VALUE self, VALUE arg)
{
    VALUE str;
    if (RB_TYPE_P(arg, T_STRING)) {
        str = arg;
    }
    else {
        str = rb_check_funcall(arg, id_to_path, 0, NULL);
        if (str == Qundef)
            str = arg;
        StringValue(str);
    }
    if (memchr(RSTRING_PTR(str), '\0', RSTRING_LEN(str)))
        rb_raise(rb_eArgError, "pathname contains null byte");
    str = rb_obj_dup(str);
    set_strpath(self, str);
    return self;
}
  Class Method Details
.getwd
Alias for .pwd.
.glob(*args)
Returns or yields Pathname objects.
Pathname.glob("lib/i*.rb")
    #=> [#<Pathname:lib/ipaddr.rb>, #<Pathname:lib/irb.rb>]See Dir.glob.
# File 'ext/pathname/pathname.c', line 1074
static VALUE
path_s_glob(int argc, VALUE *argv, VALUE klass)
{
    VALUE args[3];
    int n;
    n = rb_scan_args(argc, argv, "12", &args[0], &args[1], &args[2]);
    if (rb_block_given_p()) {
        return rb_block_call_kw(rb_cDir, id_glob, n, args, s_glob_i, klass, RB_PASS_CALLED_KEYWORDS);
    }
    else {
        VALUE ary;
        long i;
        ary = rb_funcallv_kw(rb_cDir, id_glob, n, args, RB_PASS_CALLED_KEYWORDS);
        ary = rb_convert_type(ary, T_ARRAY, "Array", "to_ary");
        for (i = 0; i < RARRAY_LEN(ary); i++) {
            VALUE elt = RARRAY_AREF(ary, i);
            elt = rb_class_new_instance(1, &elt, klass);
            rb_ary_store(ary, i, elt);
        }
        return ary;
    }
}
  .mktmpdir
Creates a tmp directory and wraps the returned path in a Pathname object.
See Dir.mktmpdir
.pwd Also known as: .getwd
Returns the current working directory as a Pathname.
Pathname.getwd
    #=> #<Pathname:/home/zzak/projects/ruby>See Dir.getwd.
# File 'ext/pathname/pathname.c', line 1154
static VALUE
path_s_getwd(VALUE klass)
{
    VALUE str;
    str = rb_funcall(rb_cDir, id_getwd, 0);
    return rb_class_new_instance(1, &str, klass);
}
  Instance Attribute Details
    #absolute?  ⇒ Boolean  (readonly)
  
# File 'ext/pathname/lib/pathname.rb', line 233
def absolute? ABSOLUTE_PATH.match? @path end
    #blockdev?  ⇒ Boolean  (readonly)
  
See FileTest.blockdev?.
# File 'ext/pathname/pathname.c', line 831
static VALUE
path_blockdev_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_blockdev_p, 1, get_strpath(self));
}
  
    #chardev?  ⇒ Boolean  (readonly)
  
See FileTest.chardev?.
# File 'ext/pathname/pathname.c', line 840
static VALUE
path_chardev_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_chardev_p, 1, get_strpath(self));
}
  
    #directory?  ⇒ Boolean  (readonly)
  
See FileTest.directory?.
# File 'ext/pathname/pathname.c', line 885
static VALUE
path_directory_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_directory_p, 1, get_strpath(self));
}
  
    #empty?  ⇒ Boolean  (readonly)
  
Tests the file is empty.
See Dir#empty? and FileTest.empty?.
# File 'ext/pathname/pathname.c', line 1049
static VALUE
path_empty_p(VALUE self)
{
    VALUE path = get_strpath(self);
    if (RTEST(rb_funcall(rb_mFileTest, id_directory_p, 1, path)))
        return rb_funcall(rb_cDir, id_empty_p, 1, path);
    else
        return rb_funcall(rb_mFileTest, id_empty_p, 1, path);
}
  
    #executable?  ⇒ Boolean  (readonly)
  
See FileTest.executable?.
# File 'ext/pathname/pathname.c', line 849
static VALUE
path_executable_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_executable_p, 1, get_strpath(self));
}
  
    #executable_real?  ⇒ Boolean  (readonly)
  
See FileTest.executable_real?.
# File 'ext/pathname/pathname.c', line 858
static VALUE
path_executable_real_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_executable_real_p, 1, get_strpath(self));
}
  
    #exist?  ⇒ Boolean  (readonly)
  
See FileTest.exist?.
# File 'ext/pathname/pathname.c', line 867
static VALUE
path_exist_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_exist_p, 1, get_strpath(self));
}
  
    #file?  ⇒ Boolean  (readonly)
  
See FileTest.file?.
# File 'ext/pathname/pathname.c', line 894
static VALUE
path_file_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_file_p, 1, get_strpath(self));
}
  
    #grpowned?  ⇒ Boolean  (readonly)
  
See FileTest.grpowned?.
# File 'ext/pathname/pathname.c', line 876
static VALUE
path_grpowned_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_grpowned_p, 1, get_strpath(self));
}
  
    #mountpoint?  ⇒ Boolean  (readonly)
  
Returns true if self points to a mountpoint.
    #owned?  ⇒ Boolean  (readonly)
  
See FileTest.owned?.
# File 'ext/pathname/pathname.c', line 921
static VALUE
path_owned_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_owned_p, 1, get_strpath(self));
}
  
    #pipe?  ⇒ Boolean  (readonly)
  
See FileTest.pipe?.
# File 'ext/pathname/pathname.c', line 903
static VALUE
path_pipe_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_pipe_p, 1, get_strpath(self));
}
  
    #readable?  ⇒ Boolean  (readonly)
  
See FileTest.readable?.
# File 'ext/pathname/pathname.c', line 930
static VALUE
path_readable_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_readable_p, 1, get_strpath(self));
}
  
    #readable_real?  ⇒ Boolean  (readonly)
  
See FileTest.readable_real?.
# File 'ext/pathname/pathname.c', line 948
static VALUE
path_readable_real_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_readable_real_p, 1, get_strpath(self));
}
  
    #relative?  ⇒ Boolean  (readonly)
  
The opposite of #absolute?
It returns false if the pathname begins with a slash.
p = Pathname.new('/im/sure')
p.relative?
    #=> false
p = Pathname.new('not/so/sure')
p.relative?
    #=> true# File 'ext/pathname/lib/pathname.rb', line 248
def relative? !absolute? end
    #root?  ⇒ Boolean  (readonly)
  
Predicate method for root directories.  Returns true if the pathname consists of consecutive slashes.
It doesn’t access the filesystem.  So it may return false for some pathnames which points to roots such as /usr/...
# File 'ext/pathname/lib/pathname.rb', line 218
def root? chop_basename(@path) == nil && /#{SEPARATOR_PAT}/o.match?(@path) end
    #setgid?  ⇒ Boolean  (readonly)
  
See FileTest.setgid?.
# File 'ext/pathname/pathname.c', line 966
static VALUE
path_setgid_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_setgid_p, 1, get_strpath(self));
}
  
    #setuid?  ⇒ Boolean  (readonly)
  
See FileTest.setuid?.
# File 'ext/pathname/pathname.c', line 957
static VALUE
path_setuid_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_setuid_p, 1, get_strpath(self));
}
  #size (readonly)
See FileTest.size.
# File 'ext/pathname/pathname.c', line 975
static VALUE
path_size(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_size, 1, get_strpath(self));
}
  
    #size?  ⇒ Boolean  (readonly)
  
See FileTest.size?.
# File 'ext/pathname/pathname.c', line 984
static VALUE
path_size_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_size_p, 1, get_strpath(self));
}
  
    #socket?  ⇒ Boolean  (readonly)
  
See FileTest.socket?.
# File 'ext/pathname/pathname.c', line 912
static VALUE
path_socket_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_socket_p, 1, get_strpath(self));
}
  
    #sticky?  ⇒ Boolean  (readonly)
  
See FileTest.sticky?.
# File 'ext/pathname/pathname.c', line 993
static VALUE
path_sticky_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_sticky_p, 1, get_strpath(self));
}
  
    #symlink?  ⇒ Boolean  (readonly)
  
See FileTest.symlink?.
# File 'ext/pathname/pathname.c', line 1002
static VALUE
path_symlink_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_symlink_p, 1, get_strpath(self));
}
  
    #world_readable?  ⇒ Boolean  (readonly)
  
See FileTest.world_readable?.
# File 'ext/pathname/pathname.c', line 939
static VALUE
path_world_readable_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_world_readable_p, 1, get_strpath(self));
}
  
    #world_writable?  ⇒ Boolean  (readonly)
  
See FileTest.world_writable?.
# File 'ext/pathname/pathname.c', line 1020
static VALUE
path_world_writable_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_world_writable_p, 1, get_strpath(self));
}
  
    #writable?  ⇒ Boolean  (readonly)
  
See FileTest.writable?.
# File 'ext/pathname/pathname.c', line 1011
static VALUE
path_writable_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_writable_p, 1, get_strpath(self));
}
  
    #writable_real?  ⇒ Boolean  (readonly)
  
See FileTest.writable_real?.
# File 'ext/pathname/pathname.c', line 1029
static VALUE
path_writable_real_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_writable_real_p, 1, get_strpath(self));
}
  
    #zero?  ⇒ Boolean  (readonly)
  
See FileTest.zero?.
# File 'ext/pathname/pathname.c', line 1038
static VALUE
path_zero_p(VALUE self)
{
    return rb_funcall(rb_mFileTest, id_zero_p, 1, get_strpath(self));
}
  Instance Method Details
#+(other) Also known as: #/
Appends a pathname fragment to self to produce a new Pathname object. Since other is considered as a path relative to self, if other is an absolute path, the new Pathname object is created from just other.
p1 = Pathname.new("/usr")      # Pathname:/usr
p2 = p1 + "bin/ruby"           # Pathname:/usr/bin/ruby
p3 = p1 + "/etc/passwd"        # Pathname:/etc/passwd
# / is aliased to +.
p4 = p1 / "bin/ruby"           # Pathname:/usr/bin/ruby
p5 = p1 / "/etc/passwd"        # Pathname:/etc/passwdThis method doesn’t access the file system; it is pure string manipulation.
#/(other)
Alias for #+.
# File 'ext/pathname/lib/pathname.rb', line 360
alias / +
#<=>(other)
Provides a case-sensitive comparison operator for pathnames.
Pathname.new('/usr') <=> Pathname.new('/usr/bin')
    #=> -1
Pathname.new('/usr/bin') <=> Pathname.new('/usr/bin')
    #=> 0
Pathname.new('/usr/bin') <=> Pathname.new('/USR/BIN')
    #=> 1It will return -1, 0 or 1 depending on the value of the left argument relative to the right argument. Or it will return nil if the arguments are not comparable.
# File 'ext/pathname/pathname.c', line 160
static VALUE
path_cmp(VALUE self, VALUE other)
{
    VALUE s1, s2;
    char *p1, *p2;
    char *e1, *e2;
    if (!rb_obj_is_kind_of(other, rb_cPathname))
        return Qnil;
    s1 = get_strpath(self);
    s2 = get_strpath(other);
    p1 = RSTRING_PTR(s1);
    p2 = RSTRING_PTR(s2);
    e1 = p1 + RSTRING_LEN(s1);
    e2 = p2 + RSTRING_LEN(s2);
    while (p1 < e1 && p2 < e2) {
        int c1, c2;
        c1 = (unsigned char)*p1++;
        c2 = (unsigned char)*p2++;
        if (c1 == '/') c1 = '\0';
        if (c2 == '/') c2 = '\0';
        if (c1 != c2) {
            if (c1 < c2)
                return INT2FIX(-1);
            else
                return INT2FIX(1);
        }
    }
    if (p1 < e1)
        return INT2FIX(1);
    if (p2 < e2)
        return INT2FIX(-1);
    return INT2FIX(0);
}
  #==(other) Also known as: #===, #eql?
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.
# File 'ext/pathname/pathname.c', line 138
static VALUE
path_eq(VALUE self, VALUE other)
{
    if (!rb_obj_is_kind_of(other, rb_cPathname))
        return Qfalse;
    return rb_str_equal(get_strpath(self), get_strpath(other));
}
  #===(other)
Alias for #==.
#add_trailing_separator(path) (private)
add_trailing_separator(path) -> path
#ascend {|_self| ... }
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>Returns an Enumerator if no block was given.
enum = Pathname.new("/usr/bin/ruby").ascend
  # ... do stuff ...
enum.each { |e| ... }
  # yields Pathnames /usr/bin/ruby, /usr/bin, /usr, and /.It doesn’t access the filesystem.
# File 'ext/pathname/lib/pathname.rb', line 330
def ascend return to_enum(__method__) unless block_given? path = @path yield self while r = chop_basename(path) path, = r break if path.empty? yield self.class.new(del_trailing_separator(path)) end end
    #atime  ⇒ Time   
Returns the last access time for the file.
See File.atime.
# File 'ext/pathname/pathname.c', line 476
static VALUE
path_atime(VALUE self)
{
    return rb_funcall(rb_cFile, id_atime, 1, get_strpath(self));
}
  #basename(*args)
Returns the last component of the path.
See File.basename.
# File 'ext/pathname/pathname.c', line 755
static VALUE
path_basename(int argc, VALUE *argv, VALUE self)
{
    VALUE str = get_strpath(self);
    VALUE fext;
    if (rb_scan_args(argc, argv, "01", &fext) == 0)
        str = rb_funcall(rb_cFile, id_basename, 1, str);
    else
        str = rb_funcall(rb_cFile, id_basename, 2, str, fext);
    return rb_class_new_instance(1, &str, rb_obj_class(self));
}
  
    #binread([length [, offset]])  ⇒ String   
Returns all the bytes from the file, or the first N if specified.
See File.binread.
# File 'ext/pathname/pathname.c', line 375
static VALUE
path_binread(int argc, VALUE *argv, VALUE self)
{
    VALUE args[3];
    int n;
    args[0] = get_strpath(self);
    n = rb_scan_args(argc, argv, "02", &args[1], &args[2]);
    return rb_funcallv(rb_cFile, id_binread, 1+n, args);
}
  
    
      #binwrite(string, [offset])  ⇒ Fixnum 
      #binwrite(string, [offset], open_args)  ⇒ Fixnum 
    
  
Fixnum 
      #binwrite(string, [offset], open_args)  ⇒ Fixnum 
    Writes contents to the file, opening it in binary mode.
See File.binwrite.
# File 'ext/pathname/pathname.c', line 417
static VALUE
path_binwrite(int argc, VALUE *argv, VALUE self)
{
    VALUE args[4];
    int n;
    args[0] = get_strpath(self);
    n = rb_scan_args(argc, argv, "03", &args[1], &args[2], &args[3]);
    return rb_funcallv_kw(rb_cFile, id_binwrite, 1+n, args, RB_PASS_CALLED_KEYWORDS);
}
  
    #birthtime  ⇒ Time   
Returns the birth time for the file. If the platform doesn’t have birthtime, raises NotImplementedError.
See File.birthtime.
# File 'ext/pathname/pathname.c', line 491
static VALUE
path_birthtime(VALUE self)
{
    return rb_funcall(rb_cFile, id_birthtime, 1, get_strpath(self));
}
  #children(with_directory = true)
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:
pn = Pathname("/usr/lib/ruby/1.8")
pn.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, ... ]
pn.children(false)
    # -> [ Pathname:English.rb, Pathname:Env.rb, Pathname:abbrev.rb, ... ]Note that the results never contain the entries . and .. in the directory because they are not children.
# File 'ext/pathname/lib/pathname.rb', line 449
def children(with_directory=true) with_directory = false if @path == '.' result = [] Dir.foreach(@path) {|e| next if e == '.' || e == '..' if with_directory result << self.class.new(File.join(@path, e)) else result << self.class.new(e) end } result end
    #chmod(mode_int)  ⇒ Integer   
Changes file permissions.
See File.chmod.
# File 'ext/pathname/pathname.c', line 533
static VALUE
path_chmod(VALUE self, VALUE mode)
{
    return rb_funcall(rb_cFile, id_chmod, 2, mode, get_strpath(self));
}
  #chop_basename(path) (private)
chop_basename(path) -> [pre-basename, basename] or nil
# File 'ext/pathname/lib/pathname.rb', line 50
def chop_basename(path) # :nodoc: base = File.basename(path) if /\A#{SEPARATOR_PAT}?\z/o.match?(base) return nil else return path[0, path.rindex(base)], base end end
    #chown(owner_int, group_int)  ⇒ Integer   
Change owner and group of the file.
See File.chown.
# File 'ext/pathname/pathname.c', line 561
static VALUE
path_chown(VALUE self, VALUE owner, VALUE group)
{
    return rb_funcall(rb_cFile, id_chown, 3, owner, group, get_strpath(self));
}
  #cleanpath(consider_symlink = false)
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.
# File 'ext/pathname/lib/pathname.rb', line 94
def cleanpath(consider_symlink=false) if consider_symlink cleanpath_conservative else cleanpath_aggressive end end
#cleanpath_aggressive (private)
Clean the path simply by resolving and removing excess . and .. entries. Nothing more, nothing less.
# File 'ext/pathname/lib/pathname.rb', line 106
def cleanpath_aggressive # :nodoc: path = @path names = [] pre = path while r = chop_basename(pre) pre, base = r case base when '.' when '..' names.unshift base else if names[0] == '..' names.shift else names.unshift base end end end pre.tr!(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR if /#{SEPARATOR_PAT}/o.match?(File.basename(pre)) names.shift while names[0] == '..' end self.class.new(prepend_prefix(pre, File.join(*names))) end
#cleanpath_conservative (private)
# File 'ext/pathname/lib/pathname.rb', line 165
def cleanpath_conservative # :nodoc: path = @path names = [] pre = path while r = chop_basename(pre) pre, base = r names.unshift base if base != '.' end pre.tr!(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR if /#{SEPARATOR_PAT}/o.match?(File.basename(pre)) names.shift while names[0] == '..' end if names.empty? self.class.new(File.dirname(pre)) else if names.last != '..' && File.basename(path) == '.' names << '.' end result = prepend_prefix(pre, File.join(*names)) if /\A(?:\.|\.\.)\z/ !~ names.last && has_trailing_separator?(path) self.class.new(add_trailing_separator(result)) else self.class.new(result) end end end
    #ctime  ⇒ Time   
Returns the last change time, using directory information, not the file itself.
See File.ctime.
# File 'ext/pathname/pathname.c', line 505
static VALUE
path_ctime(VALUE self)
{
    return rb_funcall(rb_cFile, id_ctime, 1, get_strpath(self));
}
  #del_trailing_separator(path) (private)
# File 'ext/pathname/lib/pathname.rb', line 153
def del_trailing_separator(path) # :nodoc: if r = chop_basename(path) pre, basename = r pre + basename elsif /#{SEPARATOR_PAT}+\z/o =~ path $` + File.dirname(path)[/#{SEPARATOR_PAT}*\z/o] else path end end
#delete Also known as: #unlink
Removes a file or directory, using File.unlink if self is a file, or Dir.unlink as necessary.
# File 'ext/pathname/pathname.c', line 1282
static VALUE
path_unlink(VALUE self)
{
    VALUE eENOTDIR = rb_const_get_at(rb_mErrno, id_ENOTDIR);
    VALUE str = get_strpath(self);
    return rb_rescue2(unlink_body, str, unlink_rescue, str, eENOTDIR, (VALUE)0);
}
  #descend
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>Returns an Enumerator if no block was given.
enum = Pathname.new("/usr/bin/ruby").descend
  # ... do stuff ...
enum.each { |e| ... }
  # yields Pathnames /, /usr, /usr/bin, and /usr/bin/ruby.It doesn’t access the filesystem.
# File 'ext/pathname/lib/pathname.rb', line 297
def descend return to_enum(__method__) unless block_given? vs = [] ascend {|v| vs << v } vs.reverse_each {|v| yield v } nil end
#dirname
Returns all but the last component of the path.
See File.dirname.
# File 'ext/pathname/pathname.c', line 772
static VALUE
path_dirname(VALUE self)
{
    VALUE str = get_strpath(self);
    str = rb_funcall(rb_cFile, id_dirname, 1, str);
    return rb_class_new_instance(1, &str, rb_obj_class(self));
}
  #each_child(with_directory = true, &b)
Iterates over the children of the directory (files and subdirectories, not recursive).
It yields Pathname object for each child.
By default, the yielded 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.
Pathname("/usr/local").each_child {|f| p f }
#=> #<Pathname:/usr/local/share>
#   #<Pathname:/usr/local/bin>
#   #<Pathname:/usr/local/games>
#   #<Pathname:/usr/local/lib>
#   #<Pathname:/usr/local/include>
#   #<Pathname:/usr/local/sbin>
#   #<Pathname:/usr/local/src>
#   #<Pathname:/usr/local/man>
Pathname("/usr/local").each_child(false) {|f| p f }
#=> #<Pathname:share>
#   #<Pathname:bin>
#   #<Pathname:games>
#   #<Pathname:lib>
#   #<Pathname:include>
#   #<Pathname:sbin>
#   #<Pathname:src>
#   #<Pathname:man>Note that the results never contain the entries . and .. in the directory because they are not children.
See #children
# File 'ext/pathname/lib/pathname.rb', line 499
def each_child(with_directory=true, &b) children(with_directory).each(&b) end
#each_entry
Iterates over the entries (files and subdirectories) in the directory, yielding a Pathname object for each entry.
# File 'ext/pathname/pathname.c', line 1256
static VALUE
path_each_entry(VALUE self)
{
    VALUE args[1];
    RETURN_ENUMERATOR(self, 0, 0);
    args[0] = get_strpath(self);
    return rb_block_call(rb_cDir, id_foreach, 1, args, each_entry_i, rb_obj_class(self));
}
  #each_filename
Iterates over each component of the path.
Pathname.new("/usr/bin/ruby").each_filename {|filename| ... }
  # yields "usr", "bin", and "ruby".Returns an Enumerator if no block was given.
enum = Pathname.new("/usr/bin/ruby").each_filename
  # ... do stuff ...
enum.each { |e| ... }
  # yields "usr", "bin", and "ruby".# File 'ext/pathname/lib/pathname.rb', line 265
def each_filename # :yield: filename return to_enum(__method__) unless block_given? _, names = split_names(@path) names.each {|filename| yield filename } nil end
    
      #each_line {|line| ... } 
      #each_line(sep=$/ [, open_args]) {|line| ... } ⇒ nil 
      #each_line(limit [, open_args]) {|line| ... } ⇒ nil 
      #each_line(sep, limit [, open_args]) {|line| ... } ⇒ nil 
      #each_line(...)  ⇒ Enumerator 
    
  
nil 
      #each_line(limit [, open_args]) {|line| ... } ⇒ nil 
      #each_line(sep, limit [, open_args]) {|line| ... } ⇒ nil 
      #each_line(...)  ⇒ Enumerator 
    Iterates over each line in the file and yields a String object for each.
# File 'ext/pathname/pathname.c', line 329
static VALUE
path_each_line(int argc, VALUE *argv, VALUE self)
{
    VALUE args[4];
    int n;
    args[0] = get_strpath(self);
    n = rb_scan_args(argc, argv, "03", &args[1], &args[2], &args[3]);
    if (rb_block_given_p()) {
        return rb_block_call_kw(rb_cFile, id_foreach, 1+n, args, 0, 0, RB_PASS_CALLED_KEYWORDS);
    }
    else {
        return rb_funcallv_kw(rb_cFile, id_foreach, 1+n, args, RB_PASS_CALLED_KEYWORDS);
    }
}
  #entries
Return the entries (files and subdirectories) in the directory, each as a Pathname object.
The results contains just the names in the directory, without any trailing slashes or recursive look-up.
pp Pathname.new('/usr/local').entries
#=> [#<Pathname:share>,
#    #<Pathname:lib>,
#    #<Pathname:..>,
#    #<Pathname:include>,
#    #<Pathname:etc>,
#    #<Pathname:bin>,
#    #<Pathname:man>,
#    #<Pathname:games>,
#    #<Pathname:.>,
#    #<Pathname:sbin>,
#    #<Pathname:src>]The result may contain the current directory #<Pathname:.> and the parent directory #<Pathname:..>.
If you don’t want . and .. and want directories, consider #children.
# File 'ext/pathname/pathname.c', line 1188
static VALUE
path_entries(VALUE self)
{
    VALUE klass, str, ary;
    long i;
    klass = rb_obj_class(self);
    str = get_strpath(self);
    ary = rb_funcall(rb_cDir, id_entries, 1, str);
    ary = rb_convert_type(ary, T_ARRAY, "Array", "to_ary");
    for (i = 0; i < RARRAY_LEN(ary); i++) {
        VALUE elt = RARRAY_AREF(ary, i);
        elt = rb_class_new_instance(1, &elt, klass);
        rb_ary_store(ary, i, elt);
    }
    return ary;
}
  #eql?(other)
Alias for #==.
#expand_path(*args)
Returns the absolute path for the file.
See File.expand_path.
# File 'ext/pathname/pathname.c', line 797
static VALUE
path_expand_path(int argc, VALUE *argv, VALUE self)
{
    VALUE str = get_strpath(self);
    VALUE dname;
    if (rb_scan_args(argc, argv, "01", &dname) == 0)
        str = rb_funcall(rb_cFile, id_expand_path, 1, str);
    else
        str = rb_funcall(rb_cFile, id_expand_path, 2, str, dname);
    return rb_class_new_instance(1, &str, rb_obj_class(self));
}
  #extname
Returns the file’s extension.
See File.extname.
# File 'ext/pathname/pathname.c', line 785
static VALUE
path_extname(VALUE self)
{
    VALUE str = get_strpath(self);
    return rb_funcall(rb_cFile, id_extname, 1, str);
}
  #find(ignore_error: true)
Iterates over the directory tree in a depth first manner, yielding a Pathname for each file under “this” directory.
Returns an Enumerator if no block is given.
Since it is implemented by the standard library module Find, Find.prune can be used to control the traversal.
If self is ., yielded pathnames begin with a filename in the current directory, not #/.
See Find.find
# File 'ext/pathname/lib/pathname.rb', line 571
def find(ignore_error: true) # :yield: pathname return to_enum(__method__, ignore_error: ignore_error) unless block_given? require 'find' if @path == '.' Find.find(@path, ignore_error: ignore_error) {|f| yield self.class.new(f.delete_prefix('./')) } else Find.find(@path, ignore_error: ignore_error) {|f| yield self.class.new(f) } end end
    
      #fnmatch(pattern, [flags])  ⇒ Boolean 
      #fnmatch?(pattern, [flags])  ⇒ Boolean 
    
    Also known as: #fnmatch?
  
Boolean 
      #fnmatch?(pattern, [flags])  ⇒ Boolean 
    Return true if the receiver matches the given pattern.
See File.fnmatch.
# File 'ext/pathname/pathname.c', line 590
static VALUE
path_fnmatch(int argc, VALUE *argv, VALUE self)
{
    VALUE str = get_strpath(self);
    VALUE pattern, flags;
    if (rb_scan_args(argc, argv, "11", &pattern, &flags) == 1)
        return rb_funcall(rb_cFile, id_fnmatch, 2, pattern, str);
    else
        return rb_funcall(rb_cFile, id_fnmatch, 3, pattern, str, flags);
}
  
    
      #fnmatch(pattern, [flags])  ⇒ Boolean 
      #fnmatch?(pattern, [flags])  ⇒ Boolean 
    
  
Boolean 
      #fnmatch?(pattern, [flags])  ⇒ Boolean 
    Alias for #fnmatch.
#freeze ⇒ Object
Freezes this Pathname.
See Object.freeze.
# File 'ext/pathname/pathname.c', line 125
static VALUE
path_freeze(VALUE self)
{
    rb_call_super(0, 0);
    rb_str_freeze(get_strpath(self));
    return self;
}
  
    #ftype  ⇒ String   
Returns “type” of file (“file”, “directory”, etc).
See File.ftype.
# File 'ext/pathname/pathname.c', line 609
static VALUE
path_ftype(VALUE self)
{
    return rb_funcall(rb_cFile, id_ftype, 1, get_strpath(self));
}
  #glob(*args)
Returns or yields Pathname objects.
Pathname("ruby-2.4.2").glob("R*.md")
#=> [#<Pathname:ruby-2.4.2/README.md>, #<Pathname:ruby-2.4.2/README.ja.md>]See Dir.glob. This method uses the base keyword argument of Dir.glob.
# File 'ext/pathname/pathname.c', line 1114
static VALUE
path_glob(int argc, VALUE *argv, VALUE self)
{
    VALUE args[3];
    int n;
    n = rb_scan_args(argc, argv, "11", &args[0], &args[1]);
    if (n == 1)
      args[1] = INT2FIX(0);
    args[2] = rb_hash_new();
    rb_hash_aset(args[2], ID2SYM(id_base), get_strpath(self));
    n = 3;
    if (rb_block_given_p()) {
        return rb_block_call_kw(rb_cDir, id_glob, n, args, glob_i, self, RB_PASS_KEYWORDS);
    }
    else {
        VALUE ary;
        long i;
        ary = rb_funcallv_kw(rb_cDir, id_glob, n, args, RB_PASS_KEYWORDS);
        ary = rb_convert_type(ary, T_ARRAY, "Array", "to_ary");
        for (i = 0; i < RARRAY_LEN(ary); i++) {
            VALUE elt = RARRAY_AREF(ary, i);
            elt = rb_funcall(self, '+', 1, elt);
            rb_ary_store(ary, i, elt);
        }
        return ary;
    }
}
  
    #has_trailing_separator?(path)  ⇒ Boolean  (private)
  
  has_trailing_separator?(path) -> bool
# File 'ext/pathname/lib/pathname.rb', line 133
def has_trailing_separator?(path) # :nodoc: if r = chop_basename(path) pre, basename = r pre.length + basename.length < path.length else false end end
#hash
# File 'ext/pathname/pathname.c', line 199
static VALUE
path_hash(VALUE self)
{
    return ST2FIX(rb_str_hash(get_strpath(self)));
}
  #inspect
# File 'ext/pathname/pathname.c', line 221
static VALUE
path_inspect(VALUE self)
{
    const char *c = rb_obj_classname(self);
    VALUE str = get_strpath(self);
    return rb_sprintf("#<%s:%"PRIsVALUE">", c, str);
}
  #join(*args)
Joins the given pathnames onto self to create a new Pathname object. This is effectively the same as using #+ to append self and all arguments sequentially.
path0 = Pathname.new("/usr")                # Pathname:/usr
path0 = path0.join("bin/ruby")              # Pathname:/usr/bin/ruby
    # is the same as
path1 = Pathname.new("/usr") + "bin/ruby"   # Pathname:/usr/bin/ruby
path0 == path1
    #=> true# File 'ext/pathname/lib/pathname.rb', line 416
def join(*args) return self if args.empty? result = args.pop result = Pathname.new(result) unless Pathname === result return result if result.absolute? args.reverse_each {|arg| arg = Pathname.new(arg) unless Pathname === arg result = arg + result return result if result.absolute? } self + result end
    #lchmod(mode_int)  ⇒ Integer   
Same as #chmod, but does not follow symbolic links.
See File.lchmod.
# File 'ext/pathname/pathname.c', line 547
static VALUE
path_lchmod(VALUE self, VALUE mode)
{
    return rb_funcall(rb_cFile, id_lchmod, 2, mode, get_strpath(self));
}
  
    #lchown(owner_int, group_int)  ⇒ Integer   
Same as #chown, but does not follow symbolic links.
See File.lchown.
# File 'ext/pathname/pathname.c', line 575
static VALUE
path_lchown(VALUE self, VALUE owner, VALUE group)
{
    return rb_funcall(rb_cFile, id_lchown, 3, owner, group, get_strpath(self));
}
  #lstat
See File.lstat.
# File 'ext/pathname/pathname.c', line 695
static VALUE
path_lstat(VALUE self)
{
    return rb_funcall(rb_cFile, id_lstat, 1, get_strpath(self));
}
  #lutime(atime, mtime)
Update the access and modification times of the file.
Same as #utime, but does not follow symbolic links.
See File.lutime.
# File 'ext/pathname/pathname.c', line 744
static VALUE
path_lutime(VALUE self, VALUE atime, VALUE mtime)
{
    return rb_funcall(rb_cFile, id_lutime, 3, atime, mtime, get_strpath(self));
}
  #make_link(old)
Creates a hard link at pathname.
See File.link.
# File 'ext/pathname/pathname.c', line 623
static VALUE
path_make_link(VALUE self, VALUE old)
{
    return rb_funcall(rb_cFile, id_link, 2, old, get_strpath(self));
}
  #make_symlink(old)
Creates a symbolic link.
See File.symlink.
# File 'ext/pathname/pathname.c', line 709
static VALUE
path_make_symlink(VALUE self, VALUE old)
{
    return rb_funcall(rb_cFile, id_symlink, 2, old, get_strpath(self));
}
  #mkdir(*args)
Create the referenced directory.
See Dir.mkdir.
# File 'ext/pathname/pathname.c', line 1210
static VALUE
path_mkdir(int argc, VALUE *argv, VALUE self)
{
    VALUE str = get_strpath(self);
    VALUE vmode;
    if (rb_scan_args(argc, argv, "01", &vmode) == 0)
        return rb_funcall(rb_cDir, id_mkdir, 1, str);
    else
        return rb_funcall(rb_cDir, id_mkdir, 2, str, vmode);
}
  #mkpath(mode: nil)
Creates a full path, including any intermediate directories that don’t yet exist.
See FileUtils.mkpath and FileUtils.mkdir_p
# File 'ext/pathname/lib/pathname.rb', line 588
def mkpath(mode: nil) require 'fileutils' FileUtils.mkpath(@path, mode: mode) self end
    #mtime  ⇒ Time   
Returns the last modified time of the file.
See File.mtime.
# File 'ext/pathname/pathname.c', line 519
static VALUE
path_mtime(VALUE self)
{
    return rb_funcall(rb_cFile, id_mtime, 1, get_strpath(self));
}
  Opens the file for reading or writing.
See File.open.
# File 'ext/pathname/pathname.c', line 641
static VALUE
path_open(int argc, VALUE *argv, VALUE self)
{
    VALUE args[4];
    int n;
    args[0] = get_strpath(self);
    n = rb_scan_args(argc, argv, "03", &args[1], &args[2], &args[3]);
    if (rb_block_given_p()) {
        return rb_block_call_kw(rb_cFile, id_open, 1+n, args, 0, 0, RB_PASS_CALLED_KEYWORDS);
    }
    else {
        return rb_funcallv_kw(rb_cFile, id_open, 1+n, args, RB_PASS_CALLED_KEYWORDS);
    }
}
  #opendir
Opens the referenced directory.
See Dir.open.
# File 'ext/pathname/pathname.c', line 1237
static VALUE
path_opendir(VALUE self)
{
    VALUE args[1];
    args[0] = get_strpath(self);
    return rb_block_call(rb_cDir, id_open, 1, args, 0, 0);
}
  #parent
Returns the parent directory.
This is same as self + '..'.
# File 'ext/pathname/lib/pathname.rb', line 196
def parent self + '..' end
#plus(path1, path2) (private)
-> path # :nodoc:
# File 'ext/pathname/lib/pathname.rb', line 362
def plus(path1, path2) # -> path # :nodoc: prefix2 = path2 index_list2 = [] basename_list2 = [] while r2 = chop_basename(prefix2) prefix2, basename2 = r2 index_list2.unshift prefix2.length basename_list2.unshift basename2 end return path2 if prefix2 != '' prefix1 = path1 while true while !basename_list2.empty? && basename_list2.first == '.' index_list2.shift basename_list2.shift end break unless r1 = chop_basename(prefix1) prefix1, basename1 = r1 next if basename1 == '.' if basename1 == '..' || basename_list2.empty? || basename_list2.first != '..' prefix1 = prefix1 + basename1 break end index_list2.shift basename_list2.shift end r1 = chop_basename(prefix1) if !r1 && (r1 = /#{SEPARATOR_PAT}/o.match?(File.basename(prefix1))) while !basename_list2.empty? && basename_list2.first == '..' index_list2.shift basename_list2.shift end end if !basename_list2.empty? suffix2 = path2[index_list2.first..-1] r1 ? File.join(prefix1, suffix2) : prefix1 + suffix2 else r1 ? prefix1 : File.dirname(prefix1) end end
#prepend_prefix(prefix, relpath) (private)
# File 'ext/pathname/lib/pathname.rb', line 71
def prepend_prefix(prefix, relpath) # :nodoc: if relpath.empty? File.dirname(prefix) elsif /#{SEPARATOR_PAT}/o.match?(prefix) prefix = File.dirname(prefix) prefix = File.join(prefix, "") if File.basename(prefix + 'a') != 'a' prefix + relpath else prefix + relpath end end
    
      #read([length [, offset]])  ⇒ String 
      #read([length [, offset]], open_args)  ⇒ String 
    
  
String 
      #read([length [, offset]], open_args)  ⇒ String 
    Returns all data from the file, or the first N bytes if specified.
See File.read.
# File 'ext/pathname/pathname.c', line 355
static VALUE
path_read(int argc, VALUE *argv, VALUE self)
{
    VALUE args[4];
    int n;
    args[0] = get_strpath(self);
    n = rb_scan_args(argc, argv, "03", &args[1], &args[2], &args[3]);
    return rb_funcallv_kw(rb_cFile, id_read, 1+n, args, RB_PASS_CALLED_KEYWORDS);
}
  
    
      #readlines(sep=$/ [, open_args])  ⇒ Array 
      #readlines(limit [, open_args])  ⇒ Array 
      #readlines(sep, limit [, open_args])  ⇒ Array 
    
  
Array 
      #readlines(limit [, open_args])  ⇒ Array 
      #readlines(sep, limit [, open_args])  ⇒ Array 
    Returns all the lines from the file.
See File.readlines.
# File 'ext/pathname/pathname.c', line 439
static VALUE
path_readlines(int argc, VALUE *argv, VALUE self)
{
    VALUE args[4];
    int n;
    args[0] = get_strpath(self);
    n = rb_scan_args(argc, argv, "03", &args[1], &args[2], &args[3]);
    return rb_funcallv_kw(rb_cFile, id_readlines, 1+n, args, RB_PASS_CALLED_KEYWORDS);
}
  #readlink
Read symbolic link.
See File.readlink.
# File 'ext/pathname/pathname.c', line 662
static VALUE
path_readlink(VALUE self)
{
    VALUE str;
    str = rb_funcall(rb_cFile, id_readlink, 1, get_strpath(self));
    return rb_class_new_instance(1, &str, rb_obj_class(self));
}
  #realdirpath(*args)
Returns the real (absolute) pathname of self in the actual filesystem.
Does not contain symlinks or useless dots, .. and ..
The last component of the real pathname can be nonexistent.
# File 'ext/pathname/pathname.c', line 310
static VALUE
path_realdirpath(int argc, VALUE *argv, VALUE self)
{
    VALUE basedir, str;
    rb_scan_args(argc, argv, "01", &basedir);
    str = rb_funcall(rb_cFile, id_realdirpath, 2, get_strpath(self), basedir);
    return rb_class_new_instance(1, &str, rb_obj_class(self));
}
  #realpath(*args)
Returns the real (absolute) pathname for self in the actual filesystem.
Does not contain symlinks or useless dots, .. and ..
All components of the pathname must exist when this method is called.
# File 'ext/pathname/pathname.c', line 294
static VALUE
path_realpath(int argc, VALUE *argv, VALUE self)
{
    VALUE basedir, str;
    rb_scan_args(argc, argv, "01", &basedir);
    str = rb_funcall(rb_cFile, id_realpath, 2, get_strpath(self), basedir);
    return rb_class_new_instance(1, &str, rb_obj_class(self));
}
  #relative_path_from(base_directory)
Returns a relative path from the given base_directory to the receiver.
If self is absolute, then base_directory must be absolute too.
If self is relative, then base_directory must be relative too.
This method doesn’t access the filesystem. It assumes no symlinks.
ArgumentError is raised when it cannot find a relative path.
Note that this method does not handle situations where the case sensitivity of the filesystem in use differs from the operating system default.
# File 'ext/pathname/lib/pathname.rb', line 517
def relative_path_from(base_directory) base_directory = Pathname.new(base_directory) unless base_directory.is_a? Pathname dest_directory = self.cleanpath.to_s base_directory = base_directory.cleanpath.to_s dest_prefix = dest_directory dest_names = [] while r = chop_basename(dest_prefix) dest_prefix, basename = r dest_names.unshift basename if basename != '.' end base_prefix = base_directory base_names = [] while r = chop_basename(base_prefix) base_prefix, basename = r base_names.unshift basename if basename != '.' end unless SAME_PATHS[dest_prefix, base_prefix] raise ArgumentError, "different prefix: #{dest_prefix.inspect} and #{base_directory.inspect}" end while !dest_names.empty? && !base_names.empty? && SAME_PATHS[dest_names.first, base_names.first] dest_names.shift base_names.shift end if base_names.include? '..' raise ArgumentError, "base_directory has ..: #{base_directory.inspect}" end base_names.fill('..') relpath_names = base_names + dest_names if relpath_names.empty? Pathname.new('.') else Pathname.new(File.join(*relpath_names)) end end
#rename(to)
Rename the file.
See File.rename.
# File 'ext/pathname/pathname.c', line 675
static VALUE
path_rename(VALUE self, VALUE to)
{
    return rb_funcall(rb_cFile, id_rename, 2, get_strpath(self), to);
}
  #rmdir
Remove the referenced directory.
See Dir.rmdir.
# File 'ext/pathname/pathname.c', line 1226
static VALUE
path_rmdir(VALUE self)
{
    return rb_funcall(rb_cDir, id_rmdir, 1, get_strpath(self));
}
  #rmtree(noop: nil, verbose: nil, secure: nil)
Recursively deletes a directory, including all directories beneath it.
See FileUtils.rm_rf
# File 'ext/pathname/lib/pathname.rb', line 597
def rmtree(noop: nil, verbose: nil, secure: nil) # The name "rmtree" is borrowed from File::Path of Perl. # File::Path provides "mkpath" and "rmtree". require 'fileutils' FileUtils.rm_rf(@path, noop: noop, verbose: verbose, secure: secure) self end
#split
[ GitHub ]# File 'ext/pathname/pathname.c', line 814
static VALUE
path_split(VALUE self)
{
    VALUE str = get_strpath(self);
    VALUE ary, dirname, basename;
    ary = rb_funcall(rb_cFile, id_split, 1, str);
    Check_Type(ary, T_ARRAY);
    dirname = rb_ary_entry(ary, 0);
    basename = rb_ary_entry(ary, 1);
    dirname = rb_class_new_instance(1, &dirname, rb_obj_class(self));
    basename = rb_class_new_instance(1, &basename, rb_obj_class(self));
    return rb_ary_new3(2, dirname, basename);
}
  #split_names(path) (private)
split_names(path) -> prefix, [name, …]
# File 'ext/pathname/lib/pathname.rb', line 61
def split_names(path) # :nodoc: names = [] while r = chop_basename(path) path, basename = r names.unshift basename end return path, names end
#stat
Returns a File::Stat object.
See File.stat.
# File 'ext/pathname/pathname.c', line 686
static VALUE
path_stat(VALUE self)
{
    return rb_funcall(rb_cFile, id_stat, 1, get_strpath(self));
}
  #sub(*args)
Return a pathname which is substituted by String#sub.
path1 = Pathname.new('/usr/bin/perl')
path1.sub('perl', 'ruby')
    #=> #<Pathname:/usr/bin/ruby># File 'ext/pathname/pathname.c', line 236
static VALUE
path_sub(int argc, VALUE *argv, VALUE self)
{
    VALUE str = get_strpath(self);
    if (rb_block_given_p()) {
        str = rb_block_call(str, id_sub, argc, argv, 0, 0);
    }
    else {
        str = rb_funcallv(str, id_sub, argc, argv);
    }
    return rb_class_new_instance(1, &str, rb_obj_class(self));
}
  #sub_ext(repl)
Return a pathname with repl added as a suffix to the basename.
If self has no extension part, repl is appended.
Pathname.new('/usr/bin/shutdown').sub_ext('.rb')
    #=> #<Pathname:/usr/bin/shutdown.rb># File 'ext/pathname/pathname.c', line 258
static VALUE
path_sub_ext(VALUE self, VALUE repl)
{
    VALUE str = get_strpath(self);
    VALUE str2;
    long extlen;
    const char *ext;
    const char *p;
    StringValue(repl);
    p = RSTRING_PTR(str);
    extlen = RSTRING_LEN(str);
    ext = ruby_enc_find_extname(p, &extlen, rb_enc_get(str));
    if (ext == NULL) {
        ext = p + RSTRING_LEN(str);
    }
    else if (extlen <= 1) {
        ext += extlen;
    }
    str2 = rb_str_subseq(str, 0, ext-p);
    rb_str_append(str2, repl);
    return rb_class_new_instance(1, &str2, rb_obj_class(self));
}
  
    #sysopen([mode, [perm]])  ⇒ Fixnum   
See IO.sysopen.
# File 'ext/pathname/pathname.c', line 457
static VALUE
path_sysopen(int argc, VALUE *argv, VALUE self)
{
    VALUE args[3];
    int n;
    args[0] = get_strpath(self);
    n = rb_scan_args(argc, argv, "02", &args[1], &args[2]);
    return rb_funcallv(rb_cIO, id_sysopen, 1+n, args);
}
  
    
      #to_s  ⇒ String 
      #to_path  ⇒ String 
    
  
String 
      #to_path  ⇒ String 
    Alias for #to_s.
    
      #to_s  ⇒ String 
      #to_path  ⇒ String 
    
    Also known as: #to_path
  
String 
      #to_path  ⇒ String 
    Return the path as a String.
to_path is implemented so Pathname objects are usable with File.open, etc.
# File 'ext/pathname/pathname.c', line 214
static VALUE
path_to_s(VALUE self)
{
    return rb_obj_dup(get_strpath(self));
}
  #truncate(length)
Truncates the file to length bytes.
See File.truncate.
# File 'ext/pathname/pathname.c', line 720
static VALUE
path_truncate(VALUE self, VALUE length)
{
    return rb_funcall(rb_cFile, id_truncate, 2, get_strpath(self), length);
}
  #unlink
Alias for #delete.
#utime(atime, mtime)
Update the access and modification times of the file.
See File.utime.
# File 'ext/pathname/pathname.c', line 731
static VALUE
path_utime(VALUE self, VALUE atime, VALUE mtime)
{
    return rb_funcall(rb_cFile, id_utime, 3, atime, mtime, get_strpath(self));
}
  
    
      #write(string, [offset])  ⇒ Fixnum 
      #write(string, [offset], open_args)  ⇒ Fixnum 
    
  
Fixnum 
      #write(string, [offset], open_args)  ⇒ Fixnum 
    Writes contents to the file.
See File.write.
# File 'ext/pathname/pathname.c', line 396
static VALUE
path_write(int argc, VALUE *argv, VALUE self)
{
    VALUE args[4];
    int n;
    args[0] = get_strpath(self);
    n = rb_scan_args(argc, argv, "03", &args[1], &args[2], &args[3]);
    return rb_funcallv_kw(rb_cFile, id_write, 1+n, args, RB_PASS_CALLED_KEYWORDS);
}