Como posso obter o nome do arquivo de um caminho de arquivo no Ruby?
Por exemplo, se eu tenho um caminho de "C:\projects\blah.dll"
e só quero o "blá".
Existe um LastIndexOf
método no Ruby?
Como posso obter o nome do arquivo de um caminho de arquivo no Ruby?
Por exemplo, se eu tenho um caminho de "C:\projects\blah.dll"
e só quero o "blá".
Existe um LastIndexOf
método no Ruby?
Respostas:
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
Não sou usuário do Windows há muito tempo, mas o nome do caminho diz que não há problemas com os separadores de nome de diretório no Windows.
pathname
funciona com caminhos locais enquanto File
assume sempre caminhos Unix (diferença é de caminho e separadores de accionamento que são usados em MS Windows, por exemplo)
Experimentar File.basename
Retorna o último componente do nome do arquivo fornecido em file_name, que deve ser formado usando barras (`` / ''), independentemente do separador usado no sistema de arquivos local. Se o sufixo for fornecido e presente no final de file_name, ele será removido.
File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb" File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
No seu caso:
File.basename("C:\\projects\\blah.dll", ".dll") #=> "blah"
Pathname.new("some/path/to/my.file").basename
obter my.file/
: '(
File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
?
Caso a extensão não seja conhecida (precisa do separador /):
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 respondeu perfeitamente, mas há algo que nenhuma das respostas mencionadas aqui. Em vez de File::extname
, você pode usar diretamente a '.*'
para obter o nome do arquivo.
File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
Mas, se você deseja obter o nome do arquivo base de qualquer arquivo de extensão específico , precisará usar File::extname
, caso contrário não.
Experimente este código
Usar extname
File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"
A resposta de Jonathon é melhor, mas informar você somelist[-1]
é uma das LastIndexOf
anotações disponíveis.
Como o krusty.ar mencionou, somelist.last
aparentemente também é.
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"
Observe que as aspas duplas escapam \ 's.
'C:\projects\blah.dll'.split('\\').last
File.basename
. E, como algumas das outras respostas, não responde à pergunta do OP.
Se você tiver acesso às variáveis ENV, scan
combinadas com este pequeno regex (que encontra a última, mas uma palavra, um ponto, a última palavra da string) colocará o nome do arquivo em 'filename':
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
Obviamente, você pode usar scan
e a regex em qualquer nome de caminho que inclua o nome do arquivo e __FILE__
é a escolha óbvia:
__FILE__.scan(/\w+\.\w+$/)