プロが教える店舗&オフィスのセキュリティ対策術

ruby の File.exist? メソッドで大文字小文字を区別してファイルの存在検査を行ないたいのですがうまくいきません。
例えば、/etc というディレクトリは自分のマシンに存在するのですが、'/ETC' で検査しても存在すること(true)になります。これを '/ETC' で検査した場合は false にしたいということです。

### 環境

- OS X 10.6.2
- ruby 1.8.7

### 実行結果

$ ruby -e "p File.exist?('/etc')" #=> true
$ ruby -e "p File.exist?('/ETC')" #=> true になってしまう。これを false と判定したい。

よろしくお願いいたします。

A 回答 (2件)

そもそもMacOSはファイル名の大文字小文字を区別しませんので、


etc,Etc,eTc,etC,ETc,EtC,eTC,ETC はすべて等価です。
なので判定したいしたくない以前の問題なんじゃないでしょうか?

どうしてもというのでしたら、
真の場合にファイル名を文字列として判別する課程も追加すればいいと思いますが、
環境によっては意図通りの働きをしてくれないかもしれません。

P.S.
MacOSの設定で大文字小文字を区別するようにもできますが、
影響範囲が大きいのでどこでどんなエラーが発生するか分からない上、
余所の環境では結局何も変わりないのでお勧めしません。

この回答への補足

ご回答ありがとうございます。

>> そもそもMacOSはファイル名の大文字小文字を区別しませんので、

あーそうでした。すいません。

>> 真の場合にファイル名を文字列として判別する課程も追加すればいいと思いますが、

対象ディレクトリ内のファイル名一覧を取得して、
対象ファイル名が case sensitive でマッチするかを検査するといった流れでしょうか?
アドバイスを元に以下のように検査してみました。

対象ディレクトリ一覧

  $ ruby -e 'Dir.glob("/*"){|f|p f}'
  ... 略
  "/Developer"
  "/etc"
  "/home"
  ... 略

### 検査実行

"/etc" があるか?

  $ ruby -e 'Dir.glob("/*"){ |f| if f =~ /\/etc/ then puts f << ":マッチ" else puts f end}'
  ...
  /Developer
  /etc:マッチ
  /home
  ...

"/ETC" があるか?

  $ ruby -e 'Dir.glob("/*"){ |f| if f =~ /\/ETC/ then puts f << ":マッチ" else puts f end}'
  ...
  /Developer
  /etc
  /home
  ...

>> MacOSの設定で大文字小文字を区別するようにもできますが、
>> 影響範囲が大きいのでどこでどんなエラーが発生するか分からない上、

そのようですね。
助言ありがとうございます。

補足日時:2010/08/30 16:38
    • good
    • 0

MacのOSについては、よくわかりませんが、#1の方の回答では、ファイル名の大文字と小文字は区別されないそうです。

windowsでも、同様にファイル名の大文字と小文字は区別されません。私が、windowsで、質問者様と同じような状況になった場合、大文字をと小文字を区別せずに、ファイルの存在のチェックをおこなうと思います。直接的な回答ではありませんが、どうして、大文字と小文字を区別されたいのか、その理由を提示されると、又、べつの回答が得られるかと思います。基本的には#1のかたが言われるとおり、大文字をと小文字を区別しない方法をとるのがよいかと思います。

この回答への補足

ご回答ありがとうざいます。

>> どうして、大文字と小文字を区別されたいのか、その理由を提示されると

ちょっと ruby スクリプトのポータビリティについて調査してました。
素朴な疑問としてご理解いただけると幸いです。

>> 基本的には#1のかたが言われるとおり、大文字をと小文字を区別しない方法をとるのがよいかと思います。

そうですね。
ちなみに centos ext3 で同じように検査すると
大文字小文字を区別するようです。

  $ruby -e 'p File.exist?("/etc")'
  true

  $ruby -e 'p File.exist?("/ETC")'
  false

これはファイルシステムに依存する挙動として理解しました。
助言ありがとうございます。

補足日時:2010/08/30 17:12
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!