Получить имя файла и расширение в Ruby

123

Я работаю над программой для загрузки видео с YouTube, преобразования его в MP3 и создания структуры каталогов для файлов.

Мой код:

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

Первый попадает в уже созданную музыкальную папку. Внутри этого я выполняю get. После этого у меня в каталоге есть два файла: «xyz.mp4» и «xyz.m4a».

Я хотел бы получить имя файла без расширения, чтобы обрабатывать оба файла по-разному.

Я использую массив, но массив всего на одно совпадение для меня звучит безумно.

Есть у кого-нибудь еще идея?

Саша Маннс
источник
5
Не используйте, $globalsкак вы. Это очень сильный намек на то, что вы не понимаете область видимости переменных и полагаетесь на глобальные переменные, чтобы «обмануть». Они являются запахом кода и ведут к несчастью и боли.
Железный Человек
Также rip.to_sи rip.splitничего не делать.
Железный Человек

Ответы:

304

Для своих целей вы можете использовать следующие функции:

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
Обратите внимание, что extnэто строка ".mp4" или даже строка".*" .
Phrogz
Спасибо. Проблема в том, что я не знаю имя файла в этом месте. Я просто знаю, что существуют два файла. Один .mp4 и один .m4a. Как я могу получить эти имена файлов?
Саша Маннс
@saigkill используйте подстановочный знак ". *", как сказал Фрогц, если вы не знаете / не заботитесь о том, что это за расширение.
Трэвис Ридер,
1
Я как минимум 60 раз хотел поцеловать человека, написавшего это
bbozo