memorandums

日々のメモです。

Rubyで大文字・小文字を区別してファイルを扱う

今日のお話はとても細かいです。作業メモとして記録します。




以前、以下のようなRubyスクリプトを作りました。

memorandums.hatenablog.com

InstaだのLINEだのという時代に古めかしいと思いますが個人的には重宝していています。

で、このスクリプトには重大な欠陥がありました。。。

iPhoneで撮影した写真の拡張子は.jpgになりますが、このRubyスクリプトでは.JPGを指定しています。.jpgにすればいいじゃないか?という話はごもっともですがデジカメで撮った写真は.JPGであることが多いので。。。どっちつかずなわけです。

今まであまり意識していなかったのですが。。。MacのデフォのHDDフォーマットでは大文字・小文字を区別しないようになっています(区別するフォーマットもありますが)。

細かくなりますが。。。Rubyのファイル一覧を取得するDir::globでは大文字・小文字を区別せずに取り出されます。

例えば、フォルダ内に a.jpg があったとして、Dir::glob("*.JPG")とすると a.jpg がマッチしてしまいます。。。

その後、私のスクリプトでは、サムネイル画像のファイル名を決めるために、オリジナルのファイル名(例えば、a.jpg)をsubメソッドを用いて文字列置換します。しかし。。。このsubメソッドは置換対象の文字列がなかった場合に。。。オリジナルの文字列を返す仕様になっているようです。例えば、以下のような感じです。ファイルは"a.jpg"だけど、探そうしている文字列は"a.JPG"なので見つからず、オリジナル画像がサムネイル画像で置き換わってしまい。。。オリジナルの写真を無くしたことが何度かありました。。。ばかですね。。。

dist = "a.jpg".sub(".JPG", "_t.JPG")

で、本日、少し時間があったのでこれらのことを調べて対処しました。

対処方法は以下のような感じです。

Dir::globでは(というか私のMBAのHDDフォーマットでは)実体のファイルが大文字・小文字でもマッチングしてしまうので、マッチングした文字列の拡張子を取り出し、その拡張子でサムネイル用のファイル名を作成するようにしました。これで、サムネイル画像でオリジナル画像を上書きしてしまう危険性がなくなったわけです。

EXT = "JPG"
Dir::glob("*." + EXT).each {|src|
  ext_ = src.slice(src.size - EXT.size, src.size)
  dist = src.sub("." + ext_, "_t." + ext_)

とりあえず個人的には一安心です。

あと、ファイル名を変名して大文字か小文字に統一するという解法もあると思いますが、いじるのが面倒なのと万一それでファイルが破損してしまうのも嫌なので。。。この解法にしました。とりあえず言い訳です。