回答:
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
私は長い間Windowsユーザーではありませんでしたが、パス名rdocは、Windowsのディレクトリ名の区切り文字には問題がないと言っています。
pathname
はローカルパス名で機能しFile
ますが、常にUnixパス名を想定します(たとえば、MS Windowsで使用されるパスとドライブのセパレーターが異なります)
file_nameで指定されたファイル名の最後のコンポーネントを返します。これは、ローカルファイルシステムで使用されている区切り文字に関係なく、スラッシュ( `` / '')を使用して形成する必要があります。接尾辞が指定され、file_nameの末尾にある場合、それは削除されます。
File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb" File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
あなたの場合:
File.basename("C:\\projects\\blah.dll", ".dll") #=> "blah"
Pathname.new("some/path/to/my.file").basename
はmy.file/
: '(
File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
ですか?
拡張子がわからない場合(/セパレーターが必要です):
irb(main):024:0> f = 'C:\foobar\blah.txt'.gsub("\\","/")
=> "C:/foobar/blah.txt"
irb(main):027:0> File.basename(f,File.extname(f))
=> "blah"
Jonathan Lonowskiは完璧に答えましたが、ここで述べられている答えのどれもないものがあります。の代わりにFile::extname
、直接a '.*'
を使用してファイル名を取得できます。
File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
ただし、特定の拡張ファイルのベースファイル名を取得するFile::extname
場合は、を使用する必要があります。それ以外の場合は使用しません。
ジョナソンの答えはより良いですが、あなたに知らせるsomelist[-1]
ためにLastIndexOf
利用可能な表記法の一つです。
krusty.arが述べているようsomelist.last
に、それも明らかにそうです。
irb(main):003:0* f = 'C:\\path\\file.txt'
irb(main):007:0> f.split('\\')
=> ["C:", "path", "file.txt"]
irb(main):008:0> f.split('\\')[-1]
=> "file.txt"
二重引用符の文字列は\をエスケープすることに注意してください。
'C:\projects\blah.dll'.split('\\').last
File.basename
。そして、他のいくつかの回答と同様に、OPの質問には回答しません。
ENV変数にアクセスできる場合scan
、この小さな正規表現(最後の1つだけの単語、ドット、次に文字列の最後の単語を見つける)と組み合わせると、ファイル名が「filename」に配置されます。
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
もちろん、scan
ファイル名を含む任意のパス名で正規表現を使用できます。これ__FILE__
は明らかな選択です。
__FILE__.scan(/\w+\.\w+$/)
あなたは現在のスクリプトへのディレクトリパスを得ることができます:
File.dirname __FILE__
File.basename __FILE__