класс Pathname
Объектно-ориентированный класс 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.
-
+
File методы-предикаты состояния
Эти методы являются фасадом для FileTest:
File методы свойств и манипуляции
Эти методы являются фасадом для File:
Методы каталогов
Эти методы являются фасадом для Dir:
-
each_entry(&block)
Утилиты
Эти методы представляют собой сочетание Find, FileUtils и других:
Документация методов
Как показано в предыдущем разделе, большинство методов в Pathname являются фасадами. В документации к таким методам обычно просто сказано, например: «См. FileTest.writable?», поскольку предполагается, что исходный метод вам уже знаком, а его документация (например, в ri) содержит больше информации. В некоторых случаях приводится краткое описание.
Константы
Открытые методы класса
# File pathname_builtin.rb, line 1120 def Pathname.getwd() self.new(Dir.getwd) end
# 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 # 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
# 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.
Общедоступные методы экземпляра
# 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
Этот метод не обращается к файловой системе; он выполняет только обработку строк.
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.
# File pathname_builtin.rb, line 234 def ==(other) return false unless Pathname === other other.path == @path end
Сравнивает этот путь с other. Сравнение выполняется по строкам. Обратите внимание, что два разных пути (foo.txt и ./foo.txt) могут указывать на один и тот же файл.
# 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
# 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 /. Метод не обращается к файловой системе.
# File pathname_builtin.rb, line 898 def atime() File.atime(@path) end
См. File.atime. Возвращает время последнего доступа.
# File pathname_builtin.rb, line 972 def basename(...) self.class.new(File.basename(@path, ...)) end
См. File.basename. Возвращает последний компонент пути.
# File pathname_builtin.rb, line 881 def binread(...) File.binread(@path, ...) end
См. File.binread. Возвращает все байты файла или, если указано, первые N байт.
# File pathname_builtin.rb, line 895 def binwrite(...) File.binwrite(@path, ...) end
Записывает contents в файл, открывая его в двоичном режиме.
См. File.binwrite.
# File pathname_builtin.rb, line 904 def birthtime() File.birthtime(@path) end
Возвращает время создания файла. Если платформа не поддерживает время создания, вызывает исключение NotImplementedError.
См. File.birthtime.
# File pathname_builtin.rb, line 1010 def blockdev?() FileTest.blockdev?(@path) end
См. FileTest.blockdev?.
# File pathname_builtin.rb, line 1013 def chardev?() FileTest.chardev?(@path) end
См. FileTest.chardev?.
# 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, ... ] Обратите внимание, что результаты никогда не содержат записи . и .. каталога, поскольку они не являются дочерними элементами.
# File pathname_builtin.rb, line 913 def chmod(mode) File.chmod(mode, @path) end
См. File.chmod. Изменяет разрешения.
# File pathname_builtin.rb, line 919 def chown(owner, group) File.chown(owner, group, @path) end
См. File.chown. Изменяет владельца и группу файла.
# 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.
# File pathname_builtin.rb, line 907 def ctime() File.ctime(@path) end
См. File.ctime. Возвращает время последнего изменения записи каталога (а не файла).
# 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. Метод не обращается к файловой системе.
# File pathname_builtin.rb, line 1039 def directory?() FileTest.directory?(@path) end
См. FileTest.directory?.
# File pathname_builtin.rb, line 975 def dirname() self.class.new(File.dirname(@path)) end
См. File.dirname. Возвращает все компоненты пути, кроме последнего.
# 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>
Обратите внимание, что результаты никогда не содержат записи . и .. каталога, поскольку они не являются дочерними элементами.
# 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.
# 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". # File pathname_builtin.rb, line 871 def each_line(...) # :yield: line File.foreach(@path, ...) end
# 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?.
# File pathname_builtin.rb, line 1127
def entries() Dir.entries(@path).map {|f| self.class.new(f) } end Возвращает записи каталога (файлы и подкаталоги), каждую в виде объекта Pathname.
# File pathname_builtin.rb, line 1027 def executable?() FileTest.executable?(@path) end
См. FileTest.executable?.
# File pathname_builtin.rb, line 1030 def executable_real?() FileTest.executable_real?(@path) end
# File pathname_builtin.rb, line 1033 def exist?() FileTest.exist?(@path) end
См. FileTest.exist?.
# File pathname_builtin.rb, line 981 def expand_path(...) self.class.new(File.expand_path(@path, ...)) end
См. File.expand_path.
# File pathname_builtin.rb, line 978 def extname() File.extname(@path) end
См. File.extname. Возвращает расширение файла.
# File pathname_builtin.rb, line 1042 def file?() FileTest.file?(@path) end
См. FileTest.file?.
# 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
# File pathname_builtin.rb, line 926 def fnmatch(pattern, ...) File.fnmatch(pattern, @path, ...) end
См. File.fnmatch. Возвращает true, если объект соответствует заданному шаблону.
# File pathname_builtin.rb, line 929 def fnmatch?(pattern, ...) File.fnmatch?(pattern, @path, ...) end
См. File.fnmatch? (то же, что и fnmatch).
# File pathname_builtin.rb, line 223 def freeze super @path.freeze self end
Замораживает текущий объект.
Object#freeze # File pathname_builtin.rb, line 933 def ftype() File.ftype(@path) end
См. File.ftype. Возвращает «тип» файла («file», «directory» и т. д.).
# 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 # File pathname_builtin.rb, line 1036 def grpowned?() FileTest.grpowned?(@path) end
См. FileTest.grpowned?.
# 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
# File pathname_builtin.rb, line 916 def lchmod(mode) File.lchmod(mode, @path) end
См. File.lchmod.
# File pathname_builtin.rb, line 922 def lchown(owner, group) File.lchown(owner, group, @path) end
См. File.lchown.
# File pathname_builtin.rb, line 953 def lstat() File.lstat(@path) end
См. File.lstat.
# File pathname_builtin.rb, line 969 def lutime(atime, mtime) File.lutime(atime, mtime, @path) end
Обновляет время доступа и время изменения файла.
Аналогичен Pathname#utime, но не следует по символическим ссылкам.
См. File.lutime.
# File pathname_builtin.rb, line 936 def make_link(old) File.link(old, @path) end
См. File.link. Создаёт жёсткую ссылку.
# File pathname_builtin.rb, line 956 def make_symlink(old) File.symlink(old, @path) end
См. File.symlink. Создаёт символическую ссылку.
# File pathname_builtin.rb, line 1139 def mkdir(...) Dir.mkdir(@path, ...) end
См. Dir.mkdir. Создаёт указанный каталог.
# 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 Создаёт полный путь, включая все промежуточные каталоги, которые ещё не существуют.
# 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 указывает на точку монтирования.
# File pathname_builtin.rb, line 910 def mtime() File.mtime(@path) end
См. File.mtime. Возвращает время последнего изменения.
# File pathname_builtin.rb, line 939 def open(...) # :yield: file File.open(@path, ...) end
См. File.open. Открывает файл для чтения или записи.
# File pathname_builtin.rb, line 1145 def opendir(&block) # :yield: dir Dir.open(@path, &block) end
См. Dir.open.
# File pathname_builtin.rb, line 1051 def owned?() FileTest.owned?(@path) end
См. FileTest.owned?.
# File pathname_builtin.rb, line 505 def parent self + '..' end
Возвращает родительский каталог.
То же, что и self + '..'.
# File pathname_builtin.rb, line 1045 def pipe?() FileTest.pipe?(@path) end
См. FileTest.pipe?.
# File pathname_builtin.rb, line 877 def read(...) File.read(@path, ...) end
См. File.read. Возвращает все данные из файла или первые N байт, если задано значение.
# File pathname_builtin.rb, line 1054 def readable?() FileTest.readable?(@path) end
См. FileTest.readable?.
# File pathname_builtin.rb, line 1060 def readable_real?() FileTest.readable_real?(@path) end
# File pathname_builtin.rb, line 884 def readlines(...) File.readlines(@path, ...) end
См. File.readlines. Возвращает все строки из файла.
# File pathname_builtin.rb, line 944 def readlink() self.class.new(File.readlink(@path)) end
См. File.readlink. Читает символическую ссылку.
# File pathname_builtin.rb, line 1003 def realdirpath(...) self.class.new(File.realdirpath(@path, ...)) end
Возвращает реальный (абсолютный) путь к self в фактической файловой системе.
Не содержит символических ссылок или лишних точек, .. и ..
Последний компонент реального пути может не существовать.
# File pathname_builtin.rb, line 996 def realpath(...) self.class.new(File.realpath(@path, ...)) end
Возвращает реальный (абсолютный) путь к self в фактической файловой системе.
Не содержит символических ссылок или лишних точек, .. и ..
На момент вызова этого метода все компоненты пути должны существовать.
# 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
# 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.
Обратите внимание: этот метод не обрабатывает ситуации, когда чувствительность файловой системы к регистру отличается от значения по умолчанию в операционной системе.
# File pathname_builtin.rb, line 947 def rename(to) File.rename(@path, to) end
См. File.rename. Переименовывает файл.
# File pathname_builtin.rb, line 1142 def rmdir() Dir.rmdir(@path) end
См. Dir.rmdir. Удаляет указанный каталог.
# 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
# File pathname_builtin.rb, line 527 def root? chop_basename(@path) == nil && SEPARATOR_PAT.match?(@path) end
Метод-предикат для корневых каталогов. Возвращает true, если путь состоит из последовательных косых черт.
Метод не обращается к файловой системе. Поэтому для некоторых путей, указывающих на корневые каталоги, например /usr/.., он может вернуть false.
# File pathname_builtin.rb, line 1066 def setgid?() FileTest.setgid?(@path) end
См. FileTest.setgid?.
# File pathname_builtin.rb, line 1063 def setuid?() FileTest.setuid?(@path) end
См. FileTest.setuid?.
# File pathname_builtin.rb, line 1069 def size() FileTest.size(@path) end
См. FileTest.size.
# File pathname_builtin.rb, line 1072 def size?() FileTest.size?(@path) end
См. FileTest.size?.
# File pathname_builtin.rb, line 1048 def socket?() FileTest.socket?(@path) end
См. FileTest.socket?.
# 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.
# File pathname_builtin.rb, line 950 def stat() File.stat(@path) end
См. File.stat. Возвращает объект File::Stat.
# File pathname_builtin.rb, line 1075 def sticky?() FileTest.sticky?(@path) end
См. FileTest.sticky?.
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>
# 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>
# File pathname_builtin.rb, line 1078 def symlink?() FileTest.symlink?(@path) end
См. FileTest.symlink?.
# File pathname_builtin.rb, line 887 def sysopen(...) File.sysopen(@path, ...) end
См. File.sysopen.
# File pathname_builtin.rb, line 254 def to_s @path.dup end
Возвращает путь в виде String.
# File pathname_builtin.rb, line 959 def truncate(length) File.truncate(@path, length) end
См. File.truncate. Обрезает файл до length байт.
# File pathname_builtin.rb, line 1153 def unlink() Dir.unlink @path rescue Errno::ENOTDIR File.unlink @path end
Удаляет файл или каталог, используя при необходимости File.unlink или Dir.unlink.
# File pathname_builtin.rb, line 962 def utime(atime, mtime) File.utime(atime, mtime, @path) end
См. File.utime. Обновляет время доступа и время изменения.
# File pathname_builtin.rb, line 1057 def world_readable?() File.world_readable?(@path) end
# File pathname_builtin.rb, line 1084 def world_writable?() File.world_writable?(@path) end
# File pathname_builtin.rb, line 1081 def writable?() FileTest.writable?(@path) end
См. FileTest.writable?.
# File pathname_builtin.rb, line 1087 def writable_real?() FileTest.writable_real?(@path) end
# File pathname_builtin.rb, line 890 def write(...) File.write(@path, ...) end
Записывает contents в файл. См. File.write.
# 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.