Obtenir le nom et l'extension du fichier dans Ruby

123

Je travaille sur un programme pour télécharger une vidéo de YouTube, la convertir en MP3 et créer une structure de répertoires pour les fichiers.

Mon code est:

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

Le premier va dans le dossier de musique déjà créé. À l'intérieur, j'exécute get. Après cela, j'ai deux fichiers dans le répertoire: "xyz.mp4" et "xyz.m4a".

Je voudrais récupérer le nom de fichier sans l'extension afin de pouvoir gérer les deux fichiers différemment.

J'utilise un tableau, mais un tableau pour une seule correspondance me semble fou.

Quelqu'un a-t-il une autre idée?

Sascha Manns
la source
5
N'utilisez pas $globalscomme vous l'êtes. Ils sont un indice très fort que vous ne comprenez pas la portée des variables et que vous vous fiez aux globaux pour "tricher". Ils sont une odeur de code et conduisent à la misère et à la douleur.
the Tin Man
Aussi rip.to_set rip.splitne rien faire.
the Tin Man

Réponses:

304

Vous pouvez utiliser les fonctions suivantes à vos fins:

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"
Stoïque
la source
15
Notez que extnc'est la chaîne ".mp4" ou même la chaîne".*" .
Phrogz
Merci. Le problème dans ce cas est que je ne connais pas le nom de fichier à cet endroit. Je sais juste que deux fichiers existent. Un .mp4 et un .m4a. Comment puis-je obtenir ces noms de fichiers?
Sascha Manns
@saigkill utilise ". *", caractère générique, comme l'a dit Phrogz si vous ne savez pas quelle est l'extension.
Travis Reeder
1
Il y a au moins 60 fois jusqu'à présent, j'ai voulu embrasser la personne qui a écrit ceci
bbozo