Ottieni il nome del file e l'estensione in Ruby


123

Sto lavorando a un programma per scaricare un video da YouTube, convertirlo in MP3 e creare una struttura di directory per i file.

Il mio codice è:

FileUtils.cd("#{$musicdir}/#{$folder}") do
  YoutubeDlhelperLibs::Downloader.get($url)
  if File.exists?('*.mp4')
    puts 'Remove unneeded tempfile'
    Dir['*.mp4'].each do |waste|
      File.delete(waste)
    end
  else
    puts 'Temporary file already deleted'
  end

  Dir['*.m4a'].each do |rip|
    rip.to_s
    rip.split
    puts 'Inside the function'
    puts rip
  end

end

Il primo va alla cartella musicale già creata. Dentro quello che sto eseguendo get. Dopo di che ho due file nella directory: "xyz.mp4" e "xyz.m4a".

Vorrei recuperare il nome del file senza l'estensione in modo da poter gestire entrambi i file in modo diverso.

Sto usando un array, ma un array per una sola corrispondenza suona folle per me.

Qualcuno ha un'altra idea?


5
Non usare $globalscome sei. Sono un indizio molto forte che non capisci lo scoping delle variabili e ti affidi alle globali per "barare". Sono odori di codice e portano a sofferenza e dolore.
Tin Man

Inoltre rip.to_se rip.splitnon fare nulla.
Tin Man

Risposte:


304

È possibile utilizzare le seguenti funzioni per il proprio scopo:

path = "/path/to/xyz.mp4"

File.basename(path)         # => "xyz.mp4"
File.extname(path)          # => ".mp4"
File.basename(path, ".mp4") # => "xyz"
File.basename(path, ".*")   # => "xyz"
File.dirname(path)          # => "/path/to"

15
Nota che extnè la stringa ".mp4" o anche la stringa".*" .
Phrogz

Grazie. Il problema in questo caso è che non conosco il nome del file in quel posto. So solo che esistono due file. Un .mp4 e uno .m4a. Come posso ottenere quei nomi di file?
Sascha Manns

@saigkill usa ". *", carattere jolly, come ha detto Phrogz se non sai / ti interessa qual è l'estensione.
Travis Reeder

1
Ci sono almeno 60 volte finora in cui ho voluto baciare la persona che ha scritto questo
bbozo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.