
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 と判定したい。
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
そもそも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の設定で大文字小文字を区別するようにもできますが、
>> 影響範囲が大きいのでどこでどんなエラーが発生するか分からない上、
そのようですね。
助言ありがとうございます。

No.2
- 回答日時:
MacのOSについては、よくわかりませんが、#1の方の回答では、ファイル名の大文字と小文字は区別されないそうです。
windowsでも、同様にファイル名の大文字と小文字は区別されません。私が、windowsで、質問者様と同じような状況になった場合、大文字をと小文字を区別せずに、ファイルの存在のチェックをおこなうと思います。直接的な回答ではありませんが、どうして、大文字と小文字を区別されたいのか、その理由を提示されると、又、べつの回答が得られるかと思います。基本的には#1のかたが言われるとおり、大文字をと小文字を区別しない方法をとるのがよいかと思います。この回答への補足
ご回答ありがとうざいます。
>> どうして、大文字と小文字を区別されたいのか、その理由を提示されると
ちょっと ruby スクリプトのポータビリティについて調査してました。
素朴な疑問としてご理解いただけると幸いです。
>> 基本的には#1のかたが言われるとおり、大文字をと小文字を区別しない方法をとるのがよいかと思います。
そうですね。
ちなみに centos ext3 で同じように検査すると
大文字小文字を区別するようです。
$ruby -e 'p File.exist?("/etc")'
true
$ruby -e 'p File.exist?("/ETC")'
false
これはファイルシステムに依存する挙動として理解しました。
助言ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSSのhtmlへの紐付けについ...
-
パソコンのスクリーンセーバー...
-
Ruby require ライブラリー
-
ruby OpenURI::Meta
-
ruby while式
-
ruby loopメソッド 変数(再喝)
-
ruby 配列
-
ruby loopメソッド 変数
-
ruby クラス・オブジェクト・イ...
-
ルビー言語 ライブラリー 追記
-
ruby raise句
-
ruby begin句
-
ruby ensure句
-
ルビー言語 ライブラリー(再々...
-
ルビー言語 csvファイル 続き(...
-
ルビー言語 csvファイル 続き
-
ルビー言語 ライブラリー
-
ルビー言語 csvファイル part2
-
ルビー言語 ライブラリー
-
Ruby 格納
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
小文字wと大文字Wの区別
-
Ruby expect 条件文(if文)の書き方
-
「大文字・小文字・スペース」...
-
Ruby の記号 $? の意味を教えて
-
フォルダー名の大文字小文字
-
プログラミング言語で大文字と...
-
ruby の File.exist? メソッド...
-
Filterで大文字、小文字の区別
-
web上のhtmlファイルから文字デ...
-
COBOLのIFの入れ子について
-
VB.NETで階乗を求めるプログラ...
-
Ruby / passenger のインストー...
-
CかC++どちらを覚えるべきですか?
-
Ruby on Railsでボタンをクリッ...
-
Passengerがインストールできな...
-
Ruby interpreter (CUI) 2.2.3 ...
-
Rubyの.soについて
-
We're sorry, but something we...
-
二つの図形を画面上で同時に動...
-
ruby の Σ計算
おすすめ情報