如何从 unix 或 windows 格式的给定文件路径中获取 ruby 中的基名?
How to obtain basename in ruby from the given file path in unix or windows format?
我需要从我作为输入获取的文件路径中解析 ruby 中的基本名称。 Unix 格式在 Linux.
上工作正常
File.basename("/tmp/text.txt")
return "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 文件名不包含 \
,它将起作用。
尝试 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
反斜杠,尽管 Windows 表达事物的方式,只是一个巨大的麻烦。在双引号字符串中,它们具有特殊含义,因此您需要执行以下操作:
File.basename("C:\Users\john\note.txt")
或者使用单引号来避免这个问题:
File.basename('C:\Users\john\note.txt')
或者使用不受影响的常规斜线:
File.basename("C:/Users/john/note.txt")
其中 Ruby 为您映射到特定于平台的路径分隔符。
我不认为您的代码有问题。我认为你的测试有问题。
Ruby 还在字符串中使用 escape sequences 的反斜杠字符,因此当您键入字符串文字 "C:\Users\john\note.txt"
时,Ruby 将前两个反斜杠视为无效转义序列,因此忽略转义字符。 \n
指的是一个换行符。所以,对于 Ruby,这个文字与 "C:Usersjohn\note.txt"
是一样的。该序列中没有任何文件分隔符,因为 \n 是换行符,而不是反斜杠后跟字母 n,所以 File.basename 只是 returns当它收到它时。
如果您在图形用户界面 (GUI) 或命令行界面 (CLI) 中要求用户输入,输入输入的用户不必担心 Ruby 字符串转义序列;那些只对直接在代码中的 String 文字有影响。尝试一下!将 gets
键入 IRB or Pry,然后键入或复制文件路径,然后按 Enter,然后查看 Ruby 如何将其显示为字符串文字。
在 Windows 上,Ruby 接受使用“/”(File::SEPARATOR)和“\\”(File::ALT_SEPARATOR)给出的路径,因此您不需要不用担心转换,除非您将其显示给用户。
我需要从我作为输入获取的文件路径中解析 ruby 中的基本名称。 Unix 格式在 Linux.
上工作正常File.basename("/tmp/text.txt")
return "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 文件名不包含 \
,它将起作用。
尝试 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
反斜杠,尽管 Windows 表达事物的方式,只是一个巨大的麻烦。在双引号字符串中,它们具有特殊含义,因此您需要执行以下操作:
File.basename("C:\Users\john\note.txt")
或者使用单引号来避免这个问题:
File.basename('C:\Users\john\note.txt')
或者使用不受影响的常规斜线:
File.basename("C:/Users/john/note.txt")
其中 Ruby 为您映射到特定于平台的路径分隔符。
我不认为您的代码有问题。我认为你的测试有问题。
Ruby 还在字符串中使用 escape sequences 的反斜杠字符,因此当您键入字符串文字 "C:\Users\john\note.txt"
时,Ruby 将前两个反斜杠视为无效转义序列,因此忽略转义字符。 \n
指的是一个换行符。所以,对于 Ruby,这个文字与 "C:Usersjohn\note.txt"
是一样的。该序列中没有任何文件分隔符,因为 \n 是换行符,而不是反斜杠后跟字母 n,所以 File.basename 只是 returns当它收到它时。
如果您在图形用户界面 (GUI) 或命令行界面 (CLI) 中要求用户输入,输入输入的用户不必担心 Ruby 字符串转义序列;那些只对直接在代码中的 String 文字有影响。尝试一下!将 gets
键入 IRB or Pry,然后键入或复制文件路径,然后按 Enter,然后查看 Ruby 如何将其显示为字符串文字。
在 Windows 上,Ruby 接受使用“/”(File::SEPARATOR)和“\\”(File::ALT_SEPARATOR)给出的路径,因此您不需要不用担心转换,除非您将其显示给用户。