2017-03-07 58 views
0

我是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来帮助我找出问题。

任何帮助表示赞赏。

回答

0

通过确保异步流在移动时未打开来修复它。

我只是不停地有人把数据,对象本身

def moveFilesIntoFolders 
    $mediaFiles.each do |file| 
    destinationFolder = "#{PATH}/CONVERTED/#{file.genre}/#{file.soloArtist}/#{file.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 
    end 
end