
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ランキング
-
ruby OpenURI::Meta
-
Ruby require ライブラリー
-
Accessで文字列のバイト数読み込み
-
VBScriptでExcel(2019)上のデー...
-
(再質問)エクセルのマクロボ...
-
英数字を含む文字列(0-9,A-Z)...
-
C言語の入力した文字を反転させ...
-
【メモリ不足で落ちる(python)】
-
WSLのUbuntuで、Railsのインス...
-
ruby while式
-
ruby loopメソッド 変数(再喝)
-
ruby 配列
-
ruby loopメソッド 変数
-
ruby クラス・オブジェクト・イ...
-
ルビー言語 ライブラリー 追記
-
ruby raise句
-
ruby begin句
-
ruby ensure句
-
ルビー言語 ライブラリー(再々...
-
ルビー言語 csvファイル 続き(...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
小文字wと大文字Wの区別
-
プログラミング言語で大文字と...
-
ruby の File.exist? メソッド...
-
「大文字・小文字・スペース」...
-
パソの名は 小文字で入れたと思...
-
Filterで大文字、小文字の区別
-
Shift_JISについて
-
【Ruby】shift-jisのページの置換
-
ruby on railsインストールでエ...
-
COBOLのIFの入れ子について
-
VB.NETで階乗を求めるプログラ...
-
web上のhtmlファイルから文字デ...
-
画像をページ右側に並べる方法...
-
Xcodeでランダム整数
-
RubyでNo such file or directo...
-
Pro*CとCの間|変数の有効範囲
-
プログラミング講師はまだ需要...
-
rubyプログラムからrubyプログ...
-
たびたびすいません。VBAです。
-
Ruby / passenger のインストー...
おすすめ情報