Ruby Mp3Info在移动之前未正确关闭

时间:2017-03-07 21:32:37

标签: ruby file exception filesystems mp3

我是Ruby的新手,请原谅我对语言的无知。

我写了一个简单的应用程序来帮助我整理音乐。这个应用程序只需读取一个文件夹,获取所有MP3文件:

如果Title标签包含(feat.whatArtist),则将其移至Artist标签

然后只拆分'(专长....)'东西并单独存储,以便我可以使用它来按照流派/艺术家/专辑/ songFile单独的文件夹整理我的音乐

这只是我解析所有音乐的方法,并通过剥离'功能来保持文件夹的最小化。这种方式" Eminem(壮举蕾哈娜)"没有一个单独的文件夹,而只是放在" Eminem"文件夹中。

这是我的来源:

datatype input = Bool_value of bool | String_Value of string | Exp_value of string
datatype bin_op = switch | and

fun helper(switch, x::y::xs) = y::x::stack 
    |   helper(and, Bool_value(x)::Bool_value(y)::xs) = Bool_value(x and y)::xs

在我的" moveFilesIntoFolders"方法,它会在MP3File.open语句上抛出异常。 例外情况如下:

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

最后,所有文件都重命名正确。只将它们移动到文件夹中失败了。我的想法是操作系统尚未完全重命名所有文件或反映出来,因此尝试移动文件会导致异常,因为它已被其他来源读取了吗? / p>

如果我在异常 运行&#34; moveIntoFolders&#34;之后重新运行该应用程序方法,然后它完美地工作。这只是我正在进行重命名,然后立即在一个导致异常的单独方法中进行移动的事实。 那么有没有办法让Ruby等待进程完全或任何事情完成?我甚至试过做一个“睡觉”。命令,但没有工作..

我对这门语言知之甚少,或者使用Pry来帮助我找出问题时,有经验调试。

感谢任何帮助。

1 个答案:

答案 0 :(得分: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