Lembre-se de que não há nada de especial em um ponto seguido por alguns (três, talvez) caracteres. Eles fazem parte do nome do arquivo. Alguns sistemas operacionais periféricos acham que há algo de especial nessa parte de um nome de arquivo, mas você não deve cair nessa armadilha.
Não sei por que essa é a resposta classificada como nº 1 quando File.basename não requer um 'requesito' adicional de 'nome do caminho'.
precisa saber é o seguinte
11
Classe pathnamefunciona com caminhos locais enquanto Fileassume sempre caminhos Unix (diferença é de caminho e separadores de accionamento que são usados em MS Windows, por exemplo)
nimrodm
3
Apesar de ter sido aceita pelo OP, essa resposta não responde de fato à pergunta do OP. Veja as respostas de Jonathan Lonowski e Arup Rakshit.
GSnyder #
6
A extensão está presente se houver uma. A resposta está errada.
Ludovic Kuty
4
Por favor, não vandalize suas próprias postagens. Obrigado!
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.
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.
Trata-o puramente como uma string, e não como um caminho, torna o código menos portátil.
usar o seguinte código
Isso é muito mais complexo do que o necessário e é específico do Windows. Você pode apenas File.basename. E, como algumas das outras respostas, não responde à pergunta do OP.
Keith Bennett
0
Se você tiver acesso às variáveis ENV, scancombinadas 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 scane a regex em qualquer nome de caminho que inclua o nome do arquivo e __FILE__é a escolha óbvia:
Respostas:
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.
fonte
pathname
funciona com caminhos locais enquantoFile
assume sempre caminhos Unix (diferença é de caminho e separadores de accionamento que são usados em MS Windows, por exemplo)Experimentar
File.basename
No seu caso:
fonte
Pathname.new("some/path/to/my.file").basename
obtermy.file/
: '(File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
?Caso a extensão não seja conhecida (precisa do separador /):
fonte
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.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.fonte
Experimente este código
Usar
extname
fonte
A resposta de Jonathon é melhor, mas informar você
somelist[-1]
é uma dasLastIndexOf
anotações disponíveis.Como o krusty.ar mencionou,
somelist.last
aparentemente também é.fonte
Observe que as aspas duplas escapam \ 's.
fonte
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':Obviamente, você pode usar
scan
e a regex em qualquer nome de caminho que inclua o nome do arquivo e__FILE__
é a escolha óbvia:fonte
Você pode obter o caminho do diretório para o script atual com:
fonte
File.basename __FILE__