В ruby я могу проверить с помощью Pathname("/some/path/").directory?
, действительно ли путь является каталогом. Это будет работать только в том случае, если каталог действительно существует.
Как я могу проверить, является ли Pathname("/some/path/")
путем к каталогу, даже если он не существует? Он должен быть независимым от платформы, поэтому я не могу просто проверить косую черту.
🤔 А знаете ли вы, что...
Ruby популярен в мире искусственного интеллекта и машинного обучения.
Если путь еще не находится в файловой системе, это просто имя. Его тип (например, файл или каталог) не фиксируется, пока вы не создадите с ним объект файловой системы. Итак, я рекомендую либо однозначно конструировать путь к каждому каталогу с завершающим разделителем, либо использовать путь для создания файла или каталога с соответствующими методами для его предполагаемого типа.
Если вы используете модуль Pathname, Pathname не обязательно должен существовать для использования. В таких случаях полезно отметить, что механизм Ruby преобразует прямую косую черту в обратную косую черту в Windows, поэтому следующие сконструированные пути должны работать в Windows, Linux, MacOS и Unix:
Pathname('/some/path/').to_s.end_with? ?/
#=> true
Pathname('C:/some/path/').to_s.end_with? ?/
#=> true
Однако, если ваше имя пути создано вручную или программно без чтения из файловой системы или с использованием File#join, вам может потребоваться использовать класс символов для проверки разделителей *nix и Windows. Например:
require 'pathname'
%w[ /some/path/ C:\\some\\path\\ ].map do |path|
Pathname(path).to_s.match? %r![/\\]\z!
end
#=> [true, true]
Если вы создаете путь без завершающего разделителя каталогов, но каталог фактически не существует в файловой системе, то вы не можете определить только по имени, должен ли он быть файлом или каталогом. Путь — это всего лишь особый тип объекта String. В документации прямо указано (выделено мной):
Путь представляет собой имя файла или каталога в файловой системе, но не сам файл.
В этом случае лучше всего изменить конструктор Pathname, чтобы убедиться, что вы создаете имена с конечными разделителями в первую очередь. Если вы не можете или не хотите этого делать, вам придется оставить это на усмотрение вашей файловой системы, написав код для явного вызова соответствующего метода для ожидаемого объекта файловой системы. Например:
require 'pathname'
require 'fileutils'
path = Pathname '/tmp/foo'
# ensure file or directory doesn't already exist
path.rmtree
# use path as file
FileUtils.touch path
path.file?
#=> true
# remove path before next test
path.unlink
# use path as directory
path.mkpath
path.directory?
#=> true
Как видите, путь без завершающей (обратной) косой черты можно использовать как для файлов, так и для каталогов, в зависимости от того, как вы его используете.