Как получить базовое имя в ruby ​​из заданного пути к файлу в формате unix или windows? - PullRequest
0 голосов
/ 08 марта 2019

Мне нужно проанализировать базовое имя в ruby ​​a из пути к файлу, который я получаю в качестве входных данных. Формат Unix отлично работает в Linux.

File.basename("/tmp/text.txt")

вернуть "text.txt".
Однако, когда я получаю ввод в формате Windows:

File.basename("C:\Users\john\note.txt")

или

File.basename("C:\\Users\\john\\note.txt")

«C: Usersjohn \ note.txt» - это вывод (заметьте, что \n - это новая строка там), но я не получил «note.txt».

Есть ли какое-нибудь хорошее решение в ruby ​​/ rails?

Решение:

"C:\\test\\note.txt".split(/\\|\//).last
=> "note.txt"
"/tmp/test/note.txt".split(/\\|\//).last
=> "note.txt"

Если имя файла Linux не содержит \, оно будет работать.

Ответы [ 3 ]

1 голос
/ 10 марта 2019

Я не уверен, что у вас проблемы с вашим кодом. Я думаю, что у вас есть проблемы с вашим тестом.

Ruby также использует символ обратной косой черты для escape-последовательностей в строках, поэтому при вводе строкового литерала "C:\Users\john\note.txt" Ruby видит первые два обратных слеша как недопустимые escape-последовательности и поэтому игнорирует escape-символ. \n относится к переводу строки. Таким образом, для Ruby этот литерал такой же, как "C:Usersjohn\note.txt". В этой последовательности нет разделителей файлов, поскольку \ n - это новая строка, а не обратная косая черта, за которой следует буква n , поэтому File.basename просто возвращает его при получении.

Если вы запрашиваете ввод данных пользователем в графическом интерфейсе (GUI) или в интерфейсе командной строки (CLI), пользователю, вводящему ввод, не нужно беспокоиться о escape-последовательностях Ruby String; они имеют значение только для строковых литералов непосредственно в коде. Попытайся! Введите gets в IRB или Pry , введите или скопируйте путь к файлу и нажмите Введите и посмотрите, как Ruby отображает его в виде строкового литерала.

В Windows Ruby принимает пути, указанные как "/" (File :: SEPARATOR), так и "\\" ( File :: ALT_SEPARATOR ), поэтому вам не нужно беспокоиться о преобразовании, если только вы показываете его пользователю.

1 голос
/ 08 марта 2019

Попробуйте pathname:

require 'pathname'

Pathname.new('C:\Users\john\note.txt').basename
# => #<Pathname:note.txt>

Pathname docs

Ref Как получить имя файла без расширения из пути к файлу в Ruby

0 голосов
/ 09 марта 2019

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

File.basename("C:\\Users\\john\\note.txt")

, либо использовать одинарные кавычки, чтобы избежать проблемы:

File.basename('C:\Users\john\note.txt')

Или использовать обычные слэши, которые нене влияет:

File.basename("C:/Users/john/note.txt")

Где Ruby выполняет сопоставление для вас с разделителем пути для конкретной платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...