【问题标题】:Ruby Mp3Info not closing properly before movingRuby Mp3Info 移动前未正确关闭
【发布时间】:2017-03-07 21:32:37
【问题描述】:

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

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

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

然后将“(feat....)”内容拆分并单独存储,以便我可以使用它来按流派/艺术家/专辑/歌曲文件将我的音乐组织在单独的文件夹中

这只是我解析所有音乐并通过剥离“功能”将文件夹保持在最低限度的方式,这样“Eminem (feat. Rihanna)”不会有单独的文件夹,而只会放在“阿姆”文件夹。

这是我的来源:

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>'

最后,所有文件都被正确重命名。仅将它们移动到文件夹中失败了。我的想法是操作系统尚未完全完成对所有文件的重命名或反映这一点,因此尝试移动文件会导致异常,因为它已经被另一个源读取?

如果我在异常 only 运行“moveIntoFolders”方法后重新运行应用程序,那么它可以完美运行。只是我正在重命名,然后立即在导致异常的单独方法中进行移动。 那么有没有办法让Ruby等待该过程完全完成或任何事情?我什至尝试过执行“睡眠”命令,但没有成功..

我只是对该语言不够了解,或者即使使用 Pry 来帮助我找出问题,也没有调试它的经验。

感谢任何帮助。

【问题讨论】:

    标签: ruby file exception filesystems mp3


    【解决方案1】:

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

    我只是将它提取的数据保存在对象本身中

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 1970-01-01
      • 2011-11-03
      • 2019-12-20
      • 2011-03-08
      相关资源
      最近更新 更多