Spec-Zone.ru › Ruby 4.0

класс Pathname

Родительский класс:
Object

Объектно-ориентированный класс Pathname

Автор

Tanaka Akira <akr@m17n.org>

Документация

Автор и Gavin Sinclair

Документацию см. в описании класса Pathname.

Pathname представляет имя файла или каталога в файловой системе, но не сам файл.

Путь зависит от операционной системы: Unix, Windows и т. д. Эта библиотека работает с путями локальной ОС, однако поддержка путей не для Unix является экспериментальной.

Pathname может быть относительным или абсолютным. Вопрос о том, существует ли файл, имеет значение только при попытке обратиться к нему.

Pathname неизменяем. Для его деструктивного обновления нет метода.

Цель этого класса — более удобная обработка информации о путях к файлам, чем та, которую предоставляет стандартный Ruby. Примеры ниже показывают разницу.

Вся функциональность из File, FileTest и часть функциональности из Dir и FileUtils включена предсказуемым образом. По сути, это фасад для всех этих классов и не только.

Примеры

Пример 1: Использование 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| _ }

Пример 2: Использование стандартного 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| _ }

Пример 3: Особые возможности

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, ...]

Обзор функциональности

Основные методы

Эти методы фактически работают со String, поскольку путь — это именно строка. Ни один из них не обращается к файловой системе, за исключением mountpoint?, children, each_child, realdirpath и realpath.

  • +

  • join

  • parent

  • root?

  • absolute?

  • relative?

  • relative_path_from

  • each_filename

  • cleanpath

  • realpath

  • realdirpath

  • children

  • each_child

  • mountpoint?

File методы-предикаты состояния

Эти методы являются фасадом для 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 методы свойств и манипуляции

Эти методы являются фасадом для File:

  • each_line(*args, &block)

  • read(*args)

  • binread(*args)

  • readlines(*args)

  • sysopen(*args)

  • write(*args)

  • binwrite(*args)

  • atime

  • birthtime

  • ctime

  • mtime

  • chmod(mode)

  • lchmod(mode)

  • chown(owner, group)

  • lchown(owner, group)

  • fnmatch(pattern, *args)

  • fnmatch?(pattern, *args)

  • ftype

  • make_link(old)

  • open(*args, &block)

  • readlink

  • rename(to)

  • stat

  • lstat

  • make_symlink(old)

  • truncate(length)

  • utime(atime, mtime)

  • lutime(atime, mtime)

  • basename(*args)

  • dirname

  • extname

  • expand_path(*args)

  • split

Методы каталогов

Эти методы являются фасадом для Dir:

  • Pathname.glob(*args)

  • Pathname.getwd / Pathname.pwd

  • rmdir

  • entries

  • each_entry(&block)

  • mkdir(*args)

  • opendir(*args)

Утилиты

Эти методы представляют собой сочетание Find, FileUtils и других:

  • find(&block)

  • mkpath

  • rmtree

  • unlink / delete

Документация методов

Как показано в предыдущем разделе, большинство методов в Pathname являются фасадами. В документации к таким методам обычно просто сказано, например: «См. FileTest.writable?», поскольку предполагается, что исходный метод вам уже знаком, а его документация (например, в ri) содержит больше информации. В некоторых случаях приводится краткое описание.

Константы

ABSOLUTE_PATH

Regexp, соответствующее абсолютному пути.

SEPARATOR_LIST

Строка со списком разделителей.

SEPARATOR_PAT

Regexp, соответствующее разделителю.

VERSION

Строка версии.

Открытые методы класса

getwd () Показать исходный код
# File pathname_builtin.rb, line 1120
def Pathname.getwd() self.new(Dir.getwd) end

См. Dir.getwd. Возвращает текущий рабочий каталог в виде объекта Pathname.

Также имеет псевдоним: pwd
glob (*args, **kwargs) { |pathname| ... } Показать исходный код
# File pathname_builtin.rb, line 1096
def Pathname.glob(*args, **kwargs) # :yield: pathname
  if block_given?
    Dir.glob(*args, **kwargs) {|f| yield self.new(f) }
  else
    Dir.glob(*args, **kwargs).map {|f| self.new(f) }
  end
end

См. Dir.glob. Возвращает объекты Pathname или передаёт их в блок.

mktmpdir () { |dir| ... } Показать исходный код
# File lib/pathname.rb, line 63
def self.mktmpdir
  require 'tmpdir' unless defined?(Dir.mktmpdir)
  if block_given?
    Dir.mktmpdir do |dir|
      dir = self.new(dir)
      yield dir
    end
  else
    self.new(Dir.mktmpdir)
  end
end

Создаёт временный каталог и оборачивает возвращённый путь в объект Pathname.

Обратите внимание: для использования этого метода необходимо подключить ‘pathname’.

См. Dir.mktmpdir

new (path) Показать исходный код
# File pathname_builtin.rb, line 214
def initialize(path)
  @path = File.path(path).dup
rescue TypeError => e
  raise e.class, "Pathname.new requires a String, #to_path or #to_str", cause: nil
end

Создаёт объект Pathname из указанной String (или объекта, похожего на String). Если path содержит нулевой символ (\0), возникает исключение ArgumentError.

pwd ()
Псевдоним для: getwd

Общедоступные методы экземпляра

+ (other) Показать исходный код
# File pathname_builtin.rb, line 665
def +(other)
  other = Pathname.new(other) unless Pathname === other
  Pathname.new(plus(@path, other.path))
end

Добавляет фрагмент пути к self, создавая новый объект Pathname. Поскольку other считается путём относительно self, если other — абсолютный путь, новый объект Pathname создаётся только из 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/passwd

Этот метод не обращается к файловой системе; он выполняет только обработку строк.

Также имеет псевдоним: /
/ (other)
Псевдоним для: +
<=> (p1) Показать исходный код
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);
}

Предоставляет оператор сравнения путей с учётом регистра.

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')
    #=> 1

В зависимости от значения левого аргумента относительно правого возвращает -1, 0 или 1. Если аргументы несопоставимы, возвращает nil.

== (other) Показать исходный код
# File pathname_builtin.rb, line 234
def ==(other)
  return false unless Pathname === other
  other.path == @path
end

Сравнивает этот путь с other. Сравнение выполняется по строкам. Обратите внимание, что два разных пути (foo.txt и ./foo.txt) могут указывать на один и тот же файл.

Также имеет псевдонимы: ===, eql?
=== (other)
Псевдоним для: ==
absolute? () Показать исходный код
# File pathname_builtin.rb, line 542
def absolute?
  ABSOLUTE_PATH.match? @path
end

Метод-предикат для проверки, является ли путь абсолютным.

Возвращает true, если путь начинается с косой черты.

p = Pathname.new('/im/sure')
p.absolute?
    #=> true

p = Pathname.new('not/so/sure')
p.absolute?
    #=> false
ascend () { |self| ... } Показать исходный код
# File pathname_builtin.rb, line 639
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

Перебирает элементы заданного пути в порядке возрастания и для каждого из них передаёт блоку новый объект 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>
   #<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>

Если блок не задан, возвращает объект Enumerator.

enum = Pathname.new("/usr/bin/ruby").ascend
  # ... do stuff ...
enum.each { |e| ... }
  # yields Pathnames /usr/bin/ruby, /usr/bin, /usr, and /.

Метод не обращается к файловой системе.

atime () Показать исходный код
# File pathname_builtin.rb, line 898
def atime() File.atime(@path) end

См. File.atime. Возвращает время последнего доступа.

basename (...) Показать исходный код
# File pathname_builtin.rb, line 972
def basename(...) self.class.new(File.basename(@path, ...)) end

См. File.basename. Возвращает последний компонент пути.

binread (...) Показать исходный код
# File pathname_builtin.rb, line 881
def binread(...) File.binread(@path, ...) end

См. File.binread. Возвращает все байты файла или, если указано, первые N байт.

binwrite (...) Показать исходный код
# File pathname_builtin.rb, line 895
def binwrite(...) File.binwrite(@path, ...) end

Записывает contents в файл, открывая его в двоичном режиме.

См. File.binwrite.

birthtime () Показать исходный код
# File pathname_builtin.rb, line 904
def birthtime() File.birthtime(@path) end

Возвращает время создания файла. Если платформа не поддерживает время создания, вызывает исключение NotImplementedError.

См. File.birthtime.

blockdev? () Показать исходный код
# File pathname_builtin.rb, line 1010
def blockdev?() FileTest.blockdev?(@path) end

См. FileTest.blockdev?.

chardev? () Показать исходный код
# File pathname_builtin.rb, line 1013
def chardev?() FileTest.chardev?(@path) end

См. FileTest.chardev?.

children (with_directory=true) Показать исходный код
# File pathname_builtin.rb, line 758
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

Возвращает дочерние элементы каталога (файлы и подкаталоги, без рекурсивного обхода) в виде массива объектов Pathname.

По умолчанию возвращаемые пути содержат достаточно информации для доступа к файлам. Если задать для with_directory значение false, возвращаемые пути будут содержать только имена файлов.

Например:

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, ... ]

Обратите внимание, что результаты никогда не содержат записи . и .. каталога, поскольку они не являются дочерними элементами.

chmod (mode) Показать исходный код
# File pathname_builtin.rb, line 913
def chmod(mode) File.chmod(mode, @path) end

См. File.chmod. Изменяет разрешения.

chown (owner, group) Показать исходный код
# File pathname_builtin.rb, line 919
def chown(owner, group) File.chown(owner, group, @path) end

См. File.chown. Изменяет владельца и группу файла.

cleanpath (consider_symlink=false) Показать исходный код
# File pathname_builtin.rb, line 403
def cleanpath(consider_symlink=false)
  if consider_symlink
    cleanpath_conservative
  else
    cleanpath_aggressive
  end
end

Возвращает нормализованный путь для self, удаляя повторяющиеся косые черты и ненужные точки. Файловая система не используется.

Если consider_symlink имеет значение true, используется более осторожный алгоритм, чтобы не нарушить работу символических ссылок. В результате может сохраниться больше записей .., чем абсолютно необходимо, но избежать этого без обращения к файловой системе невозможно.

См. Pathname#realpath.

ctime () Показать исходный код
# File pathname_builtin.rb, line 907
def ctime() File.ctime(@path) end

См. File.ctime. Возвращает время последнего изменения записи каталога (а не файла).

delete ()
Псевдоним для: unlink
descend () { |v| ... } Показать исходный код
# File pathname_builtin.rb, line 606
def descend
  return to_enum(__method__) unless block_given?
  vs = []
  ascend {|v| vs << v }
  vs.reverse_each {|v| yield v }
  nil
end

Перебирает элементы заданного пути в порядке убывания и для каждого из них передаёт блоку новый объект Pathname.

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>

Если блок не задан, возвращает объект Enumerator.

enum = Pathname.new("/usr/bin/ruby").descend
  # ... do stuff ...
enum.each { |e| ... }
  # yields Pathnames /, /usr, /usr/bin, and /usr/bin/ruby.

Метод не обращается к файловой системе.

directory? () Показать исходный код
# File pathname_builtin.rb, line 1039
def directory?() FileTest.directory?(@path) end

См. FileTest.directory?.

dirname () Показать исходный код
# File pathname_builtin.rb, line 975
def dirname() self.class.new(File.dirname(@path)) end

См. File.dirname. Возвращает все компоненты пути, кроме последнего.

each_child (with_directory=true, &b) Показать исходный код
# File pathname_builtin.rb, line 808
def each_child(with_directory=true, &b)
  children(with_directory).each(&b)
end

Перебирает дочерние элементы каталога (файлы и подкаталоги, без рекурсивного обхода).

Для каждого дочернего элемента передаёт блоку объект Pathname.

По умолчанию передаваемые пути содержат достаточно информации для доступа к файлам.

Если задать для with_directory значение false, возвращаемые пути будут содержать только имена файлов.

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>

Обратите внимание, что результаты никогда не содержат записи . и .. каталога, поскольку они не являются дочерними элементами.

См. Pathname#children

each_entry () { |pathname| ... } Показать исходный код
# File pathname_builtin.rb, line 1133
def each_entry(&block) # :yield: pathname
  return to_enum(__method__) unless block_given?
  Dir.foreach(@path) {|f| yield self.class.new(f) }
end

Перебирает записи каталога (файлы и подкаталоги). Для каждой записи передаёт блоку объект Pathname.

Этот метод существует с версии 1.8.1.

each_filename () { |filename| ... } Показать исходный код
# File pathname_builtin.rb, line 574
def each_filename # :yield: filename
  return to_enum(__method__) unless block_given?
  _, names = split_names(@path)
  names.each {|filename| yield filename }
  nil
end

Перебирает каждый компонент пути.

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

Если блок не задан, возвращает объект Enumerator.

enum = Pathname.new("/usr/bin/ruby").each_filename
  # ... do stuff ...
enum.each { |e| ... }
  # yields "usr", "bin", and "ruby".
each_line (...) { |line| ... } Показать исходный код
# File pathname_builtin.rb, line 871
def each_line(...) # :yield: line
  File.foreach(@path, ...)
end

each_line перебирает строки файла. Для каждой строки передаёт блоку объект String.

Этот метод существует с версии 1.8.1.

empty? () Показать исходный код
# File pathname_builtin.rb, line 1018
def empty?
  if FileTest.directory?(@path)
    Dir.empty?(@path)
  else
    File.empty?(@path)
  end
end

Проверяет, пуст ли файл.

См. Dir#empty? и FileTest.empty?.

entries () Показать исходный код
# File pathname_builtin.rb, line 1127
def entries() Dir.entries(@path).map {|f| self.class.new(f) } end

Возвращает записи каталога (файлы и подкаталоги), каждую в виде объекта Pathname.

eql? (other)
Псевдоним для: ==
executable? () Показать исходный код
# File pathname_builtin.rb, line 1027
def executable?() FileTest.executable?(@path) end

См. FileTest.executable?.

executable_real? () Показать исходный код
# File pathname_builtin.rb, line 1030
def executable_real?() FileTest.executable_real?(@path) end

См. FileTest.executable_real?.

exist? () Показать исходный код
# File pathname_builtin.rb, line 1033
def exist?() FileTest.exist?(@path) end

См. FileTest.exist?.

expand_path (...) Показать исходный код
# File pathname_builtin.rb, line 981
def expand_path(...) self.class.new(File.expand_path(@path, ...)) end

См. File.expand_path.

extname () Показать исходный код
# File pathname_builtin.rb, line 978
def extname() File.extname(@path) end

См. File.extname. Возвращает расширение файла.

file? () Показать исходный код
# File pathname_builtin.rb, line 1042
def file?() FileTest.file?(@path) end

См. FileTest.file?.

find (ignore_error: true) { |pathname| ... } Показать исходный код
# File lib/pathname.rb, line 30
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

Выполняет обход дерева каталогов в глубину и передаёт блоку объект Pathname для каждого файла внутри «этого» каталога.

Обратите внимание: для использования этого метода необходимо подключить библиотеку ‘pathname’.

Если блок не задан, возвращает объект Enumerator.

Поскольку метод реализован стандартным библиотечным модулем Find, для управления обходом можно использовать Find.prune.

Если self имеет значение ., передаваемые блоку пути начинаются с имени файла в текущем каталоге, а не с ./.

См. Find.find

fnmatch (pattern, ...) Показать исходный код
# File pathname_builtin.rb, line 926
def fnmatch(pattern, ...) File.fnmatch(pattern, @path, ...) end

См. File.fnmatch. Возвращает true, если объект соответствует заданному шаблону.

fnmatch? (pattern, ...) Показать исходный код
# File pathname_builtin.rb, line 929
def fnmatch?(pattern, ...) File.fnmatch?(pattern, @path, ...) end

См. File.fnmatch? (то же, что и fnmatch).

freeze () Показать исходный код
# File pathname_builtin.rb, line 223
def freeze
  super
  @path.freeze
  self
end

Замораживает текущий объект.

Вызывает метод суперкласса Object#freeze
ftype () Показать исходный код
# File pathname_builtin.rb, line 933
def ftype() File.ftype(@path) end

См. File.ftype. Возвращает «тип» файла («file», «directory» и т. д.).

glob (*args, **kwargs) { |pathname| ... } Показать исходный код
# File pathname_builtin.rb, line 1111
def glob(*args, **kwargs) # :yield: pathname
  if block_given?
    Dir.glob(*args, **kwargs, base: @path) {|f| yield self + f }
  else
    Dir.glob(*args, **kwargs, base: @path).map {|f| self + f }
  end
end

Возвращает объекты Pathname или передаёт их блоку.

Pathname("ruby-2.4.2").glob("R*.md")
#=> [#<Pathname:ruby-2.4.2/README.md>, #<Pathname:ruby-2.4.2/README.ja.md>]

См. Dir.glob. Этот метод использует аргумент-ключевое слово base метода Dir.glob.

grpowned? () Показать исходный код
# File pathname_builtin.rb, line 1036
def grpowned?() FileTest.grpowned?(@path) end

См. FileTest.grpowned?.

join (*args) Показать исходный код
# File pathname_builtin.rb, line 725
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

Присоединяет указанные пути к self, создавая новый объект Pathname. По сути, это эквивалентно последовательному добавлению self и всех аргументов с помощью Pathname#+.

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
lchmod (mode) Показать исходный код
# File pathname_builtin.rb, line 916
def lchmod(mode) File.lchmod(mode, @path) end

См. File.lchmod.

lchown (owner, group) Показать исходный код
# File pathname_builtin.rb, line 922
def lchown(owner, group) File.lchown(owner, group, @path) end

См. File.lchown.

lstat () Показать исходный код
# File pathname_builtin.rb, line 953
def lstat() File.lstat(@path) end

См. File.lstat.

lutime (atime, mtime) Показать исходный код
# File pathname_builtin.rb, line 969
def lutime(atime, mtime) File.lutime(atime, mtime, @path) end

Обновляет время доступа и время изменения файла.

Аналогичен Pathname#utime, но не следует по символическим ссылкам.

См. File.lutime.

make_link (old) Показать исходный код
# File pathname_builtin.rb, line 936
def make_link(old) File.link(old, @path) end

См. File.link. Создаёт жёсткую ссылку.

make_symlink (old) Показать исходный код
# File pathname_builtin.rb, line 956
def make_symlink(old) File.symlink(old, @path) end

См. File.symlink. Создаёт символическую ссылку.

mkdir (...) Показать исходный код
# File pathname_builtin.rb, line 1139
def mkdir(...) Dir.mkdir(@path, ...) end

См. Dir.mkdir. Создаёт указанный каталог.

mkpath (mode: nil) Показать исходный код
# File pathname_builtin.rb, line 334
def mkpath(mode: nil)
  path = @path == '/' ? @path : @path.chomp('/')

  stack = []
  until File.directory?(path) || File.dirname(path) == path
    stack.push path
    path = File.dirname(path)
  end

  stack.reverse_each do |dir|
    dir = dir == '/' ? dir : dir.chomp('/')
    if mode
      Dir.mkdir dir, mode
      File.chmod mode, dir
    else
      Dir.mkdir dir
    end
  rescue SystemCallError
    raise unless File.directory?(dir)
  end

  self
end

Создаёт полный путь, включая все промежуточные каталоги, которые ещё не существуют.

См. FileUtils.mkpath и FileUtils.mkdir_p

mountpoint? () Показать исходный код
# File pathname_builtin.rb, line 510
def mountpoint?
  begin
    stat1 = self.lstat
    stat2 = self.parent.lstat
    stat1.dev != stat2.dev || stat1.ino == stat2.ino
  rescue Errno::ENOENT
    false
  end
end

Возвращает true, если self указывает на точку монтирования.

mtime () Показать исходный код
# File pathname_builtin.rb, line 910
def mtime() File.mtime(@path) end

См. File.mtime. Возвращает время последнего изменения.

open (...) { |file| ... } Показать исходный код
# File pathname_builtin.rb, line 939
def open(...) # :yield: file
  File.open(@path, ...)
end

См. File.open. Открывает файл для чтения или записи.

opendir () { |dir| ... } Показать исходный код
# File pathname_builtin.rb, line 1145
def opendir(&block) # :yield: dir
  Dir.open(@path, &block)
end

См. Dir.open.

owned? () Показать исходный код
# File pathname_builtin.rb, line 1051
def owned?() FileTest.owned?(@path) end

См. FileTest.owned?.

parent () Показать исходный код
# File pathname_builtin.rb, line 505
def parent
  self + '..'
end

Возвращает родительский каталог.

То же, что и self + '..'.

pipe? () Показать исходный код
# File pathname_builtin.rb, line 1045
def pipe?() FileTest.pipe?(@path) end

См. FileTest.pipe?.

read (...) Показать исходный код
# File pathname_builtin.rb, line 877
def read(...) File.read(@path, ...) end

См. File.read. Возвращает все данные из файла или первые N байт, если задано значение.

readable? () Показать исходный код
# File pathname_builtin.rb, line 1054
def readable?() FileTest.readable?(@path) end

См. FileTest.readable?.

readable_real? () Показать исходный код
# File pathname_builtin.rb, line 1060
def readable_real?() FileTest.readable_real?(@path) end

См. FileTest.readable_real?.

readlines (...) Показать исходный код
# File pathname_builtin.rb, line 884
def readlines(...) File.readlines(@path, ...) end

См. File.readlines. Возвращает все строки из файла.

readlink () Показать исходный код
# File pathname_builtin.rb, line 944
def readlink() self.class.new(File.readlink(@path)) end

См. File.readlink. Читает символическую ссылку.

realdirpath (...) Показать исходный код
# File pathname_builtin.rb, line 1003
def realdirpath(...) self.class.new(File.realdirpath(@path, ...)) end

Возвращает реальный (абсолютный) путь к self в фактической файловой системе.

Не содержит символических ссылок или лишних точек, .. и ..

Последний компонент реального пути может не существовать.

realpath (...) Показать исходный код
# File pathname_builtin.rb, line 996
def realpath(...) self.class.new(File.realpath(@path, ...)) end

Возвращает реальный (абсолютный) путь к self в фактической файловой системе.

Не содержит символических ссылок или лишних точек, .. и ..

На момент вызова этого метода все компоненты пути должны существовать.

relative? () Показать исходный код
# File pathname_builtin.rb, line 557
def relative?
  !absolute?
end

Противоположность Pathname#absolute?

Возвращает false, если путь начинается с косой черты.

p = Pathname.new('/im/sure')
p.relative?
    #=> false

p = Pathname.new('not/so/sure')
p.relative?
    #=> true
relative_path_from (base_directory) Показать исходный код
# File pathname_builtin.rb, line 826
def relative_path_from(base_directory)
  base_directory = Pathname.new(base_directory) unless base_directory.is_a? Pathname
  dest_directory = self.cleanpath.path
  base_directory = base_directory.cleanpath.path
  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

Возвращает относительный путь от заданного base_directory к текущему объекту.

Если self является абсолютным, то base_directory также должен быть абсолютным.

Если self является относительным, то base_directory также должен быть относительным.

Этот метод не обращается к файловой системе. Он предполагает отсутствие символических ссылок.

Если относительный путь найти невозможно, возникает исключение ArgumentError.

Обратите внимание: этот метод не обрабатывает ситуации, когда чувствительность файловой системы к регистру отличается от значения по умолчанию в операционной системе.

rename (to) Показать исходный код
# File pathname_builtin.rb, line 947
def rename(to) File.rename(@path, to) end

См. File.rename. Переименовывает файл.

rmdir () Показать исходный код
# File pathname_builtin.rb, line 1142
def rmdir() Dir.rmdir(@path) end

См. Dir.rmdir. Удаляет указанный каталог.

rmtree (noop: nil, verbose: nil, secure: nil) Показать исходный код
# File lib/pathname.rb, line 48
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

Рекурсивно удаляет каталог, включая все вложенные каталоги.

Обратите внимание: для использования этого метода необходимо подключить библиотеку ‘pathname’.

См. FileUtils.rm_rf

root? () Показать исходный код
# File pathname_builtin.rb, line 527
def root?
  chop_basename(@path) == nil && SEPARATOR_PAT.match?(@path)
end

Метод-предикат для корневых каталогов. Возвращает true, если путь состоит из последовательных косых черт.

Метод не обращается к файловой системе. Поэтому для некоторых путей, указывающих на корневые каталоги, например /usr/.., он может вернуть false.

setgid? () Показать исходный код
# File pathname_builtin.rb, line 1066
def setgid?() FileTest.setgid?(@path) end

См. FileTest.setgid?.

setuid? () Показать исходный код
# File pathname_builtin.rb, line 1063
def setuid?() FileTest.setuid?(@path) end

См. FileTest.setuid?.

size () Показать исходный код
# File pathname_builtin.rb, line 1069
def size() FileTest.size(@path) end

См. FileTest.size.

size? () Показать исходный код
# File pathname_builtin.rb, line 1072
def size?() FileTest.size?(@path) end

См. FileTest.size?.

socket? () Показать исходный код
# File pathname_builtin.rb, line 1048
def socket?() FileTest.socket?(@path) end

См. FileTest.socket?.

split () Показать исходный код
# File pathname_builtin.rb, line 985
def split()
  array = File.split(@path)
  raise TypeError, 'wrong argument type nil (expected Array)' unless Array === array
  array.map {|f| self.class.new(f) }
end

См. File.split. Возвращает dirname и basename в виде Array.

stat () Показать исходный код
# File pathname_builtin.rb, line 950
def stat() File.stat(@path) end

См. File.stat. Возвращает объект File::Stat.

sticky? () Показать исходный код
# File pathname_builtin.rb, line 1075
def sticky?() FileTest.sticky?(@path) end

См. FileTest.sticky?.

sub (*args) Показать исходный код
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));
}

Возвращает путь, преобразованный с помощью String#sub.

path1 = Pathname.new('/usr/bin/perl')
path1.sub('perl', 'ruby')
    #=> #<Pathname:/usr/bin/ruby>
sub_ext (repl) Показать исходный код
# File pathname_builtin.rb, line 292
def sub_ext(repl)
  ext = File.extname(@path)

  # File.extname("foo.bar:stream") returns ".bar" on NTFS and not ".bar:stream"
  # (see ruby_enc_find_extname()).
  # The behavior of Pathname#sub_ext is to replace everything
  # from the start of the extname until the end of the path with repl.
  unless @path.end_with?(ext)
    ext = @path[@path.rindex(ext)..]
  end

  self.class.new(@path.chomp(ext) + repl)
end

Возвращает путь, добавляя repl в качестве суффикса к имени файла.

Если у текущего объекта нет расширения, добавляется repl.

Pathname.new('/usr/bin/shutdown').sub_ext('.rb')
    #=> #<Pathname:/usr/bin/shutdown.rb>
symlink? () Показать исходный код
# File pathname_builtin.rb, line 1078
def symlink?() FileTest.symlink?(@path) end

См. FileTest.symlink?.

sysopen (...) Показать исходный код
# File pathname_builtin.rb, line 887
def sysopen(...) File.sysopen(@path, ...) end

См. File.sysopen.

to_path ()

Метод to_path реализован, чтобы объекты Pathname можно было использовать с File.open и т. д.

Псевдоним для: to_s
to_s () Показать исходный код
# File pathname_builtin.rb, line 254
def to_s
  @path.dup
end

Возвращает путь в виде String.

Также имеет псевдоним: to_path
truncate (length) Показать исходный код
# File pathname_builtin.rb, line 959
def truncate(length) File.truncate(@path, length) end

См. File.truncate. Обрезает файл до length байт.

unlink () Показать исходный код
# File pathname_builtin.rb, line 1153
def unlink()
  Dir.unlink @path
rescue Errno::ENOTDIR
  File.unlink @path
end

Удаляет файл или каталог, используя при необходимости File.unlink или Dir.unlink.

Также имеет псевдоним: delete
utime (atime, mtime) Показать исходный код
# File pathname_builtin.rb, line 962
def utime(atime, mtime) File.utime(atime, mtime, @path) end

См. File.utime. Обновляет время доступа и время изменения.

world_readable? () Показать исходный код
# File pathname_builtin.rb, line 1057
def world_readable?() File.world_readable?(@path) end

См. FileTest.world_readable?.

world_writable? () Показать исходный код
# File pathname_builtin.rb, line 1084
def world_writable?() File.world_writable?(@path) end

См. FileTest.world_writable?.

writable? () Показать исходный код
# File pathname_builtin.rb, line 1081
def writable?() FileTest.writable?(@path) end

См. FileTest.writable?.

writable_real? () Показать исходный код
# File pathname_builtin.rb, line 1087
def writable_real?() FileTest.writable_real?(@path) end

См. FileTest.writable_real?.

write (...) Показать исходный код
# File pathname_builtin.rb, line 890
def write(...) File.write(@path, ...) end

Записывает contents в файл. См. File.write.

zero? () Показать исходный код
# File pathname_builtin.rb, line 1090
def zero?() FileTest.zero?(@path) end

См. FileTest.zero?.

Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API