我是Ruby的新手,所以请原谅我对语言的无知。Ruby Mp3Info移动前没有正确关闭
我写了一个简单的应用程序来帮助我组织我的音乐。此应用程序只需读取一个文件夹,得到所有的MP3文件:(壮举someArtist)
如果标题标签包含一个然后将其移动到艺术家标签
,然后就分拆“(壮举.. ..)'的东西,并单独存储,以便我可以用它来组织我的音乐在不同的文件夹按类型/艺术家/专辑/ songFile
这只是我的解析所有我的音乐和保持文件夹的方式通过这种方式剥离“特征”最小化“Eminem(feat。Rihanna)”不会有单独的文件夹,而只会放在“Eminem”文件夹中。
这里是我的源:
require "pry"
require "mp3info"
require "fileutils"
PATH = "C:/Users/MyUser/Desktop/MusicFolder"
$mediaFiles = []
$errorRenaming = []
$errorMoving = []
class MusicFile
attr_accessor :fileName, :fullyQualifiedPath, :soloArtist
def initialize(fileName, fullyQualifiedPath)
@fileName = fileName
@fullyQualifiedPath = fullyQualifiedPath
end
end
def printFiles
parseFileIntoArray
$mediaFiles.each do |item|
puts item.fullyQualifiedPath #prints all fileName's within the array
end
end
private
def parseFileIntoArray
fullyQualifiedFileNames = Dir.glob("#{PATH}/**/*.mp3").select { |fn| File.file?(fn) }
fullyQualifiedFileNames.each do |files|
$mediaFiles << MusicFile.new(files.split('/')[-1], files) #Store fully qualified filename inside of Array
end
end
#take all files, read artist
#remove (feat) from it and store artist
def moveFilesIntoFolders
$mediaFiles.each do |file|
mp3File = Mp3Info.open(file.fullyQualifiedPath) #WHOLE PROGRAM DIES RIGHT HERE
destinationFolder = "#{PATH}/CONVERTED/#{mp3File.tag.genre_s}/#{file.soloArtist}/#{mp3File.tag.album}"
unless File.directory?(destinationFolder)
begin
FileUtils.mkdir_p(destinationFolder)
rescue => exception
puts exception.backtrace
puts "Error creating directory #{destinationFolder}"
end
end
File.open(file.fullyQualifiedPath, "r") do |itemToMove|
begin
FileUtils.cp(itemToMove, destinationFolder)
rescue => exception
puts exception.backtrace
$errorMoving << file.fileName
$errorMoving.each do |error|
puts "errors moving: #{error}"
end
end
end
mp3File.close
end
puts "leaving moveFilesIntoFolders"
end
def getFeatAndParse
$mediaFiles.each do |item|
mp3File = Mp3Info.open(item.fullyQualifiedPath)
item.soloArtist = mp3File.tag.artist
if mp3File.tag.title.include?("(feat")
theIndex = mp3File.tag.title.index("(feat")
substring = mp3File.tag.title[theIndex..-1]
elsif mp3File.tag.artist.include?("(feat")
theIndex = mp3File.tag.artist.index("(feat")
substring = mp3File.tag.artist[theIndex..-1]
end
mp3File.tag.artist.slice! substring
mp3File.tag.artist = mp3File.tag.artist.split.join(" ")
item.soloArtist = mp3File.tag.artist
mp3File.tag.artist = "#{mp3File.tag.artist} #{substring}"
mp3File.close
begin
File.rename(item.fullyQualifiedPath, "#{PATH}/#{mp3File.tag.title} - #{item.soloArtist} - #{mp3File.tag.album}.mp3")
rescue => exception
puts exception.backtrace
$errorRenaming << item.fileName
$errorRenaming.each do |error|
puts "errors renaming: #{error}"
end
end
end
end
parseFileIntoArray
getFeatAndParse
moveFilesIntoFolders
在我的 “moveFilesIntoFolders” 的方法,它抛出的MP3File.open声明例外。 例外如下:
D:/Program Files/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ruby-mp3info-0.8.10/lib/mp3
info.rb:244:in `initialize': No such file or directory @ rb_sysopen - C:/Users/MyUser/Desktop/MusicFolder/test.mp3 (Errno::ENOENT)
from D:/Program Files/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ruby-mp3info-0
.8.10/lib/mp3info.rb:244:in `new'
from D:/Program Files/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ruby-mp3info-0
.8.10/lib/mp3info.rb:244:in `reload'
from D:/Program Files/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ruby-mp3info-0
.8.10/lib/mp3info.rb:230:in `initialize'
from D:/Program Files/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ruby-mp3info-0
.8.10/lib/mp3info.rb:300:in `new'
from D:/Program Files/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ruby-mp3info-0
.8.10/lib/mp3info.rb:300:in `open'
from ./main.rb:59:in `block in moveFilesIntoFolders'
from ./main.rb:58:in `each'
from ./main.rb:58:in `moveFilesIntoFolders'
from ./main.rb:124:in `<main>'
在本月底,所有的文件都被重命名正确。只有将它们移动到文件夹中失败。我的想法是,操作系统还没有完全重命名所有的文件或反映,所以然后试图移动文件导致异常,因为它已被另一个来源读取?
如果我在运行“moveIntoFolders”方法的异常只有后重新运行应用程序,那么它完美的工作。只是我正在进行重命名,然后立即在导致异常的单独方法中进行移动。 那么有没有办法让Ruby等待进程完成或完成任何事情?我甚至尝试做一个'睡眠'命令,并没有工作..
我只是不知道足够的语言或经验调试,甚至使用Pry来帮助我找出问题。
任何帮助表示赞赏。