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で質問しましょう!
似たような質問が見つかりました
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Ruby Ruby / passenger のインストールについて 1 2023/01/30 18:31
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- Ruby MacBookAir起動時にRubyソースコードをコマンドラインで実行するには? MacのOS起動時 1 2022/04/18 01:55
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Ruby Gitのクローンについて 3 2022/04/10 12:28
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- その他(SNS・コミュニケーションサービス) 爆サイやっていたら、下のような文字が出ました! これは何なのでしょうか? nginx error! 1 2023/06/09 12:27
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
- 英語 北海道大学の問題です。 Lose your memory and you, as you, ceas 3 2023/05/04 21:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビーリアルのユーザー名を変え...
-
やり 直し
-
(再質問)エクセルのマクロボ...
-
パソコンのスクリーンセーバー...
-
1、Rstudioで回帰直線を求める...
-
pandasでsqlite3にテーブル作成...
-
pythonエラー
-
パイソンのクラスについて
-
WIN11にオフイスを複数入れるこ...
-
教えてください
-
パイソンエラーについて
-
プログラミングについてです。...
-
初心者プログラミング
-
Ruby on Railsでサーバーを立ち...
-
英数字を含む文字列(0-9,A-Z)...
-
ruby
-
クリスタルレポートで困ってい...
-
VBA
-
パイソンプログラミング
-
パイソンでテキストファイルが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
小文字wと大文字Wの区別
-
プログラミング言語で大文字と...
-
フォルダー名の大文字小文字
-
Ruby expect 条件文(if文)の書き方
-
Filterで大文字、小文字の区別
-
ruby の File.exist? メソッド...
-
システムエンジニアの適正について
-
Ruby / passenger のインストー...
-
プログラミング講師はまだ需要...
-
VB.NETで階乗を求めるプログラ...
-
初心者 パイソンプログラム
-
CかC++どちらを覚えるべきですか?
-
Ruby interpreter (CUI) 2.2.3 ...
-
RubyでNo such file or directo...
-
web上のhtmlファイルから文字デ...
-
Rubyでpdfファイルを読み込む方法
-
ruby.exeとrubyw.exeに違いがあ..
-
バーコードのチェックデジット...
-
ruby 全角ハイフンを半角ハイフ...
-
rubyのevalのエラーを検知したい
おすすめ情報