File::exist?の挙動
OS の扱いが違うので仕方ないのだけれど、File::exist? の結果が時として異なるのは、うれしくない時もあるのではなかろうか、などと思った。
ディスク上に ABC.JPG というファイルがあるとして、Ubuntu など PC-UNIX 方面で、File.exist?('abc.jpg') とすると、false が返ってくる(はず)。(そもそも .JPG などという拡張子をつけるのもどうかとは思うけれど。このあたりも Windows の弊害なのかなあ)
一方、Windows では true が返ってくる。
ふと検索していたら、OK Wave だったかに MacOS X 環境で質問されているのがあって、MacOS X でも Windows と同じで大文字・小文字を区別しないで判断するらしい。そこの回答では、OS がそのように処理しているのに、区別して判定するようなことは危険なのでやってはいけない、というような論調だった。
もちろん、先の ABC.JPG がある状況の MacOS X や Windows で、それなら大丈夫とばかり abc.jpg というファイルを作ってしまうようなことがあっては面倒なことになるのだろうな、とは思う。(OS 側でそれを回避するのかどうかは知らないけれど)
仮に両方存在してしまうとそのファイルへのアクセスをどうしていいのか問題であろうし、仮にどちらかにはアクセスできてももう一方にはアクセスできないということにもなってしまうかもしれない。
Ubuntu のように大文字・小文字は区別されるのであれば、両方存在しても困らない。
もっともここで自分が区別したいと思っているのはそういうことではなくて、HTML ファイルなどで指定されているファイル名が、実際にディスク上にあるファイル名と正しく合致しているのかどうか、ということを調べたいということ。先の質問者がどのような用途に使いたかったのかはわからないけれど、何をしたいと思っていたのかで、回答も変わってしかるべきかなとは。
区別をしない Windows などでは問題なく動作しても、Ubuntu とかでは存在しないということでエラーになってしまうことになるわけで、様々な環境でも間違いなく動作したりというためには正しく指定されている必要はあると思う。
File::fnmatch には「大文字・小文字を区別せずにマッチを調べる」というオプションはあるのだけれど、逆はない。まあ、ベースが PC-UNIX 方面にあることをおもえば、そういうものなのだろうなと。
ということで、区別して調べるメソッドを追加して使ってみている。あくまでも指定されているファイル名が実際のファイル名と同じなのかを調べるために。
そうすることで、Windows でも Ubuntu でも同じ処理ができるプログラムになるってことはあるんじゃなかろうかなと。そういうものでもないかしら?
| 固定リンク
コメント