2017-03-07 1 views
0

저는 Ruby를 처음 사용했기 때문에 언어에 대한 나의 무지 함을 용납합니다.Ruby Mp3Info가 이동하기 전에 제대로 닫히지 않습니다.

나는 음악을 정리하는 데 도움이되는 간단한 응용 프로그램을 작성했습니다. 이 응용 프로그램은 단순히 폴더를 읽고 MP3 파일을 모두 가져옵니다. (공적 someArtist) 제목 태그가 포함되어있는 경우

을 다음 아티스트 태그

후 바로 '(공적을 분할로 이동합니다 .. ..) '물건을 별도로 보관하여 장르/아티스트/앨범/노래 파일별로 별도의 폴더에서 음악을 정리할 수 있습니다.

이것은 내 음악을 모두 구문 분석하고 폴더를 이 방법으로 "피처"를 벗겨내는 것만으로도 최소한 "Eminem (feat. Rihanna)"는 별도의 폴더를 가지지 않고 대신 "Eminem"폴더 안에 배치됩니다. 내 "moveFilesIntoFolders"방법 내부

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 

, 그것은이 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

이동시 비동기 스트림이 열려 있지 않도록 수정하여 문제를 해결했습니다.

는 I는 오브젝트 자체

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 
, 그것은 인상 된 데이터를 유지
관련 문제