如何从Unix或Windows格式的给定文件路径中获取ruby的基本名称?

时间:2019-03-08 20:41:38

标签: ruby linux ruby-on-rails-3

我需要从输入得到的文件路径中解析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 个答案:

答案 0 :(得分:1)

尝试pathname

require 'pathname'

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

Pathname docs

参考How to get filename without extension from file path in Ruby

答案 1 :(得分:1)

我不认为您的代码有问题。我认为您的考试有问题。

Ruby还在字符串中对escape sequences使用反斜杠字符,因此,当您键入字符串文字"C:\Users\john\note.txt"时,Ruby会将前两个反斜杠视为无效的转义序列,因此将忽略转义字符。 \n是指换行符。因此,对于Ruby,此文字与"C:Usersjohn\note.txt"相同。该顺序中没有任何文件分隔符,因为\ n是换行符,而不是反斜杠,后跟字母 n ,因此File.basename在接收到它时就返回它。

如果您在图形用户界面(GUI)或命令行界面(CLI)中要求用户输入,则输入用户无需担心Ruby String换码序列;那些只对直接在代码中的String文字有意义。尝试一下!在IRBPry中键入gets,键入或复制文件路径,然后按 Enter ,然后查看Ruby如何将其显示为String文字。 / p>

在Windows上,Ruby接受同时使用“ /”(File :: SEPARATOR)和“ \\”(File::ALT_SEPARATOR)给出的路径,因此您无需担心转换,除非您将其显示为用户。

答案 2 :(得分:0)

反斜杠虽然是Windows表达事物的方式,但却是一个巨大的麻烦。在双引号字符串中,它们具有特殊含义,因此您需要执行以下操作:

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

或使用单引号避免出现此问题:

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

或使用不受影响的常规斜杠:

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

Ruby在哪里为您映射到特定于平台的路径分隔符。