Come posso ottenere il nome file da un percorso di file in Ruby?
Ad esempio, se ho un percorso di "C:\projects\blah.dll"e voglio solo il "blah".
C'è un LastIndexOfmetodo in Ruby?
Come posso ottenere il nome file da un percorso di file in Ruby?
Ad esempio, se ho un percorso di "C:\projects\blah.dll"e voglio solo il "blah".
C'è un LastIndexOfmetodo in Ruby?
Risposte:
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
Non sono un utente Windows da molto tempo, ma il Pathname rdoc dice che non ha problemi con i separatori di nomi di directory su Windows.
pathnamefunziona con i nomi dei percorsi locali mentre Fileassume sempre i nomi dei percorsi Unix (la differenza è il percorso e i separatori di unità che vengono utilizzati in MS Windows, ad esempio)
Provare File.basename
Restituisce l'ultimo componente del nome file indicato in nome_file, che deve essere formato usando le barre (`` / '') indipendentemente dal separatore utilizzato nel file system locale. Se il suffisso viene fornito e presente alla fine di nome_file, viene rimosso.
File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb" File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
Nel tuo caso:
File.basename("C:\\projects\\blah.dll", ".dll") #=> "blah"
Pathname.new("some/path/to/my.file").basenameottenere my.file/: '(
File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz?
Nel caso in cui l'estensione non sia nota (necessita del separatore /):
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 ha risposto perfettamente, ma c'è qualcosa che nessuna delle risposte menzionate qui. Invece di File::extname, puoi usare direttamente a '.*'per ottenere il nome del file.
File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
Ma, se si desidera ottenere il nome del file di base di file di estensione specifici , è necessario utilizzare File::extname, altrimenti no.
Prova questo codice
Uso extname
File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"
La risposta di Jonathon è migliore, ma farti sapere somelist[-1]è una delle LastIndexOfnotazioni disponibili.
Come somelist.lastapparentemente cita anche krusty.ar .
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"
Si noti che le stringhe di virgolette doppie sfuggono a \ 's.
'C:\projects\blah.dll'.split('\\').last
File.basename. E, come alcune delle altre risposte, non risponde alla domanda del PO.
Se hai accesso alle variabili ENV, scancombinate con questa piccola regex (che trova l'ultima ma una parola, un punto, quindi l'ultima parola della stringa) inserirà il nome del file in 'nomefile':
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
Ovviamente, puoi usare scane il regex su qualsiasi nome di percorso che include il nome file, ed __FILE__è la scelta ovvia:
__FILE__.scan(/\w+\.\w+$/)