###前提・実現したいこと
ruby/exifrをインストールしてjpegファイルのリネームアプリを作成していますがexif情報取得時にエラーが出るので解決策をご教示いただきたいです。
$目的とする動作
指定フォルダ(pics/noname/)内のjpegファイル全てについて、exif情報に撮影日時を持つ場合には撮影日時を、持たない場合や撮影日時がnilの場合にはファイルの更新日時をputsします
###発生している問題・エラーメッセージ
$現象
何かしらexif情報を持っているファイルに対しては正常動作しますが、exif情報が全く無い(Facebookのタイムラインからダウンロードした画像など)ファイルが含まれる場合は以下のエラーメッセージを出して処理が中断します。exif情報が全く無いファイルでもエクスプローラのプロパティから適当に値を入力する(例えば「作成者」に「1」を入力する)と正常動作します。
$エラーメッセージ
exiftest.rb:18:in block (2 levels) in main': undefined method
[]' for nil:NilC
lass (NoMethodError)
###ソースコード
require "exifr"
$programDir=Dir.getwd + "/"
$beforeDir=$programDir +"pics/noname/"
def main()
beforefileexif=Hash[] #ファイルのEXIF
datetime=Hash[] #ファイルexif情報の撮影日時(キーがファイル名、値がその撮影(更新)日時)
Dir.chdir($beforeDir) Dir.open(".") {|d| d.each {|f| if File.extname(f) ==".jpg" or File.extname(f) ==".jpeg" or File.extname(f) ==".JPG" or File.extname(f) ==".JPEG" then beforefileexif[f]= EXIFR::JPEG.new(f) #↓exif情報がない場合にエラー if beforefileexif[f].exif[:date_time] !=nil then datetime[f]=beforefileexif[f].exif[:date_time] puts f + ":" + datetime[f].to_s + " by Exif" else datetime[f]=File.mtime(f) puts f + ":" + datetime[f].to_s + " by Last Modified" end end } }
end
main()
###備考
環境は
Ruby 2.0.0-p481
Windows7
です。exif情報の有無で処理を分岐させれば良いのかなと考えていて、begin,rescue,endで囲ってみましたがうまく行きませんでした。よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/05 12:44