我需要从输入得到的文件路径中解析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文件名不包含\
,它将起作用。
答案 0 :(得分:1)
尝试pathname
:
require 'pathname'
Pathname.new('C:\Users\john\note.txt').basename
# => #<Pathname:note.txt>
参考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文字有意义。尝试一下!在IRB或Pry中键入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在哪里为您映射到特定于平台的路径分隔符。