• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ruby の File.exist? メソッドで大文字小文字を区別して)

rubyのFile.exist?メソッドで大文字小文字を区別してファイルの存在検査を行なう方法

このQ&Aのポイント
  • rubyのFile.exist?メソッドを使用してファイルの存在検査を行ないたいが、大文字小文字を区別できない問題がある。
  • 例えば、/etcというディレクトリが存在する場合、'/ETC'で検査しても存在すると判定されてしまう。
  • しかし、大文字小文字を区別してファイルの存在検査を行なう方法はない。

質問者が選んだベストアンサー

  • ベストアンサー
  • wisize
  • ベストアンサー率42% (37/87)
回答No.1

そもそもMacOSはファイル名の大文字小文字を区別しませんので、 etc,Etc,eTc,etC,ETc,EtC,eTC,ETC はすべて等価です。 なので判定したいしたくない以前の問題なんじゃないでしょうか? どうしてもというのでしたら、 真の場合にファイル名を文字列として判別する課程も追加すればいいと思いますが、 環境によっては意図通りの働きをしてくれないかもしれません。 P.S. MacOSの設定で大文字小文字を区別するようにもできますが、 影響範囲が大きいのでどこでどんなエラーが発生するか分からない上、 余所の環境では結局何も変わりないのでお勧めしません。

mokokomi
質問者

補足

ご回答ありがとうございます。 >> そもそも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の設定で大文字小文字を区別するようにもできますが、 >> 影響範囲が大きいのでどこでどんなエラーが発生するか分からない上、 そのようですね。 助言ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

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

mokokomi
質問者

補足

ご回答ありがとうざいます。 >> どうして、大文字と小文字を区別されたいのか、その理由を提示されると ちょっと ruby スクリプトのポータビリティについて調査してました。 素朴な疑問としてご理解いただけると幸いです。 >> 基本的には#1のかたが言われるとおり、大文字をと小文字を区別しない方法をとるのがよいかと思います。 そうですね。 ちなみに centos ext3 で同じように検査すると 大文字小文字を区別するようです。   $ruby -e 'p File.exist?("/etc")'   true   $ruby -e 'p File.exist?("/ETC")'   false これはファイルシステムに依存する挙動として理解しました。 助言ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • RubyのDateクラスのメソッドが見つからない

    先日よりRubyでのプログラミングを始めてみたのですが DateクラスのDate::MOTHNAMESを参照しようとしたところ undefined method `MOTHNAMES' for Date:Class (NoMethodError) と返ってきてしまいました。 ほかにもDate::exist?メソッドもためしてみましたが、同じ様なコメントが 返ってきました。 undefined method `exist?' for Date:Class (NoMethodError) なお、 Date.newなどはつかえています どういった問題でどのように解決すれば良いのか、ご教示願えればと思います。 バージョンは ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.2.0] で、Mac OSX Lionで動かしています。

  • Ruby1.9での文字列操作について。

    Ruby1.9での文字列操作について。 今までRuby1.8を使用していましたが、Ruby1.9に変えてから、次の4種類の問題が出てきました。 (※Ruby1.9に変えてから、#encoding: shift_jisを定義しております) どれか1種類でも結構ですので、Ruby1.9での対策、代替の処理について教えてください。 <問題1> ■文字列を指定のバイト位置まで削除する □現在(Ruby1.8)のコード moji = "1あアあアイ234565789" moji[4,14] = "" →1.8では、"1あア"となりますが、1.9では、"1あアあ"となります。 <問題2> ■文字列の中から指定文字が見つかったバイト位置の算出 □現在(Ruby1.8)のコード n = "あいうえお".index("う") →1.8では、n=4となりますが、1.9では、n=2となります。 <問題3> ■指定した年月日の存在チェック □現在(Ruby1.8)のコード y = 1900 m = 3 d = 10 if Date.exist?(y,m,d) p "test# end →1.8では、trueとなりますが、1.9では実行時にNoMethoodErrorとなります。 <問題4> ■半角英数字→全角英数字変換 □現在(Ruby1.8)のコード sss = moji.tr('a-zA-Z0-9', 'a-zA-Z0-9') →1.9では実行時にエラーメッセージが出力されます(略) 色々と書きましたが、どうかお助けください。

    • ベストアンサー
    • Ruby
  • Ruby1.8.7 ファイルアップロードCGI

    CGI を使ったファイルのアップローダを作りたくて、今日初めて Ruby を触っていますが、質問があります。 アップロードするファイル本体以外の情報を name="version" で受け取って、保存するディレクトリを分けるようにしています。書きかけのコードは以下の通りです。(タブによるインデントが入らなかったので、アンダースコアで表現しています) ----------ここからソースコード---------- #!/usr/local/bin/ruby require "cgi" begin __print "Content-Type: text/plain\n\n" __cgi = CGI.new __print "Ruby version is " __print RUBY_VERSION,"\n" __print "filename = " __print cgi['upload_file'].original_filename, "\n" __file = cgi.params['version'][0] __if file.class == StringIO then ____print "File is StringIO Class.\n" ____print "version = " ____print cgi["version"].string, "\n" ____if File.exist? cgi["version"].string then ______print "このバージョンのディレクトリは既に存在しているため、ディレクトリは作成されませんでした。" ____else ______print "ディレクトリが存在しないので作成します。" ______Dir::mkdir(cgi["version"].string, 0755) ____end ____OUTPUT_DIR = (cgi["version"].string + "/") ____open(OUTPUT_DIR + cgi['upload_file'].original_filename, "w") {|fh| ____fh.binmode ____fh.write cgi['upload_file'].read ____} __else ____print "File is TempFile Class.\n" ____#ここから先が書きかけで分からない部分です。 __end rescue => e __print "Error!" + e end ----------ここまでソースコード---------- Ruby の CGI モジュールを使っていますが、受け取ったファイルが 10240 バイト未満だと StringIOオブジェクト、10240 バイト以上だと TempFile オブジェクトになるという規則があるそうで、オブジェクトの種類によって分岐させています。 StringIO オブジェクト(10240バイト未満の送信)の場合はこれで想定通りに動いたのですが、TempFile オブジェクトと判別された場合に、 version のテキストフィールドの文字列を print により表示(出力)したりディレクトリ名にしたりする方法が分かりません。また、ファイル本体 upload_file は TempFile オブジェクトの場合でも同じ記述でファイルに保存できますでしょうか? サーバにインストールされている Ruby のバージョンは 1.8.7 です。

  • Excel:文字列の比較:大文字と小文字の区別

    Excel(2002)のワークシートの数式で文字列を比較するとき 半角英字の大文字と小文字が区別されないようなのですが、 区別するためにはどうしたらよいのでしょうか。 ※任意のセルで ="a"="A" とすると TRUE が帰ってくる。Countif などの動作も同様。 ※VBAでは次のコードを実行すると FALSE が表示される。 Sub compare() If "a" = "A" Then MsgBox "TRUE" Else MsgBox "FALSE" End If End Sub カテゴリ違いかもしれません。とすれば申し訳ありません。よろしくおねがいします。

  • Rubyで特定のディレクトリ以下のファイル名をすべて表示するプログラム

    Rubyで特定のディレクトリ以下のファイル名をすべて表示するプログラムを書きたいのですが方法がわかりません。 どういうメソッドを使えばよいでしょうか?

    • ベストアンサー
    • CGI
  • RubyでexeファイルをつくるExerbについて

    RubyでexeファイルをつくるExerbというライブラリをインストールしたいです。 でとりあえずやってみたところどうやらうまいぐあいにインストールできていないようです。 現象としては、普通にExerbの最新版5.30を落として適当なディレクトリに配置 コマンドプロンプトからruby setup.rbでExerb内のsetup.rbファイルを実行するとコマンドライン上でインストールが進みます完了後コマンドプロンプトでexerbを実行しても 内部コマンド~~とお決まりの文章がひょうじされて実行できません。 ruby.exeはパスが通ってるのでPC内のC:/ruby/binの中をみたところexerbファイル(※中身はRubyコード)は存在しますがどうやらexerb.exeファイルが生成?されてないようです。 一応http://sourceforge.jp/projects/exerb/releases/50337にあるようにRubyコアの バージョンをあわせて実行したのですがどうしても、うまくいきません。 原因はなんなのでしょうか? 識者の方、ご教授お願いします。 ActiveRubyとかいう実装の方をインスコすればデフォルトで実行できるようなのですが もともとインストールしていたRubyがrubyinstaller-1.8.7-p330ですので、なんとか このRubyで実行させたいのです。 よろしくお願いします。

    • ベストアンサー
    • Ruby
  • ruby 1.9.3のrequireについて

    はじめまして。 私は今初めてrubyの勉強をしています。 使用している参考書はたのしいruby第3です。 ruby 1.9.3-P1.9.4でのrequireについて 今回質問させていただく内容としては requireを使用し外部ファイルを読み込もうとするとエラーになってしま.います。 同じディレクトリにファイルを置いています。 ディレクトリ構造として c:\workspaceの中にscopetest.rbとsub.rbをおいております。 scopetest.rb $x = 0 x = 0 require "sub" p $x p x sub.rb $x = 1 x = 1 実行コマンド ruby scopetestr.rb エラー C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- sub (LoadError) from C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:i n `require' from scopetest.rb:4:in `<main>' 参考書と同じにやっているのですがエラーがでてしまいます。 初歩的な質問かもしれませんがよろしくおねがいいたします。

    • ベストアンサー
    • Ruby
  • Ruby on Railsのエラー等について

    以前Javaを触っていたものですが、新しい業務で携わることになったRuby on Railsについて質問があります。 1.errorsについて ActiveRecordを継承したModelにerrorsというメソッド(プロパティ?)がありますが、この正体は何という名前のクラスでしょうか。 また、このerrorsにはaddおよびadd_to_baseというメソッドでエラーメッセージを加えることができますが、加えたエラーは蓄積されていくのでしょうか、もしくは上書きされていくのでしょうか? 例えば、 model.errors.add_to_base('エラーが発生しました') model.errors.add_to_base('エラーがでたよ') と続けて書いた場合、error_message_forで表示されるエラーは後者('エラーがでたよ')だけという動きが正しいのでしょうか?もしくは、両方とも表示されるのが正しいでしょうか? 2.論理演算子「&&」「||」について Javaの「&&」や「||」という演算子は、前の判定だけで結果が出たなら後の判定をパスして先へ進みます(例えば「A && B」でAがfalseなら、Bの判定をせずにfalseを返すといった具合)。これに対して「&」や「|」といった、前の判定がどのような結果であれ後の判定も強制的に行うという演算子が用意されています(「A & B」ならAがfalseでもBの判定も必ずするといった具合)。 Rubyにはこれに相当する演算子はないのでしょうか?「and」や「or」がありますが、どうも違うようなので。 もし詳しい方がいらっしゃれば、ご教授下さい。 よろしくお願いします。

    • ベストアンサー
    • Ruby
  • [初心者]rubyでgemが使えません

    ruby1.9.2をインストールをしたあと、rubygems1.5.0をダウンロードして ruby setup.rb でインストールしたのですが、 gem -v をしても反応がありません。No such file or directoryといわれてしまいます。環境変数をいろいろと変えてみましたがやはりダメでした。windowsだとやり方が違うのでしょうか。 検索しても答えが見つからなかったので質問させていただきました。初心者ですがよろしくお願い致します。 [os] windows xp [ruby] ruby 1.9.2p136 (2010-12-25) [i386-mingw32] [エラーメッセージ] C:\Ruby192\bin\ruby.exe: No such file or directory -- /cygdrive/c/Ruby192/bin/gem (LoadError)

    • ベストアンサー
    • Ruby
  • Ruby 改行文字の認識

    こんにちは。 最近質問させていただいているRubyのスクローリングの際に1行ごとに文章を判定し、flagを立てて取得しているのですが、下記のプログラムで改行文字「¥n」を事前に挿入しているにもかかわらずflagがうまく機能しないため質問させていただきました。 読み込んでいるhtmlファイルは改行が少ないファイルであるため、改行を入れてあげなければ余計な部分まで取得してしまう状態です。 以下プログラムです。 1 text = "" 2 data = "/home/edinet/E05267/S1001YX6/index.html" 3 4 flag = nil 5 6 File.open(data) do |f| 7 8 f.each_line do |file| 9 file.gsub!(/<\/tr>/,"\n") 10 11 #IO.foreach(file) do |line2| 12 file.each_line do |line2| 13 case line2 14 when /保有目的が純投資目的以外の目的である投資株式の保有区分|保有目的が純投資目的以外/ 15 flag = true 16 17 when /保有目的が純投資目的である投資株式|EOF|無議決権株式|政府及び地方公共団体|普通株式|【監査報酬の内容等】/ 18 flag = false if flag == true 19 20 end 21 22 text << line2 if flag != nil 23 break if flag == false 24 25 end 26 text.gsub!(/<\/td>/,"\t") 27 #text.gsub!(/<\/tr>/,"\n") 28 text.gsub!(/<[^>]+>/,"") 29 print text 30 31 end 32 end ご回答の程よろしくお願い致します。

    • ベストアンサー
    • Ruby