みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Rubyのスクリプト

Rubyを使って、ディレクトリを順に処理していくスクリプトを作ろうとしています。
下記は、perlのものです。

chdir("C:/data");
opendir(DIR, "./");
@myfolderlist= grep(-d, readdir(DIR));
close(DIR);

foreach $myfolder(@myfolderlist){
if(($myfolder ne ".") && ($myfolder ne ".." )){
print "$myfolder\n";
}
}

これに対応するような、かつRubyらしい(foreachを使う)スクリプトを作りたいと考えます。

Dir.foreach('C:/Data'){|item|
item.chomp!
print item,"\n"
}

上記のRubyスクリプトの問題は、ディレクトリのみならず、そこに存在するファイルまで出してしまいます。 Rubyにおいて、ディレクトリ」のみを持ってくるには、どのようにすれば良いでしょうか?
宜しくお願いいたします。

投稿日時 - 2007-06-06 22:36:00

QNo.3062779

すぐに回答ほしいです

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

>この.、..をスキップする方法はあるでしょうか?
普通にスキップすればいいんじゃない?

Dir.foreach('C:/Documents and Settings/') do |file|
 if FileTest.directory?(file) && file != '.' && file != '..'
  puts file
 end
end

投稿日時 - 2007-06-08 02:32:22

お礼

koko_u_さん、ありがとうございます。
だんだんと、RUBYが分かるようになってきました。

投稿日時 - 2007-06-08 22:17:56

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

気になったのですが、item.chomp! する理由がわかりません。
そして個人的にはコードが追い掛けにくくなるので

Dir.foreach('C:/data') do |item|
 unless FileTest.directory?(item)
  next
 end
 puts item
end

という風に「スキップする条件」を書くのではなく、

Dir.foreach('C:/data') do |item|
 if FileTest.directory?(item)
  puts item
 end
end

という風に「処理対象となる条件」を書くほうがよいと感じます。

投稿日時 - 2007-06-08 23:58:04

お礼

koko_u_さん、ありがとうございます。
item.chompとしている理由は、後の処理で、CRが入っていると困るからです。
>「処理対象となる条件」を書くほうがよい
了解です。確かに、その方が分かりやすいですね。
ありがとうございます。

投稿日時 - 2007-06-10 22:15:15

ANo.4

>結果は、フォルダネームのみならず、 .及び..が出てきてしまいました。
.も..もフォルダです。
.は、現在(自分自身)のディレクトリ
..は、一つ上のディレクトリ(自分の親ディレクトリ)
を意味します。

>この.、..をスキップする方法はあるでしょうか?
このディレクトリのみ、スキップする処理を更に組み込みます。
以下のようにして下さい。
Dir.foreach('C:/Data'){|item|
item.chomp!
if !FileTest.directory?(item)
 next
end
--------下記文を挿入------------
if item == "." || item == ".."
 next
end
--------挿入終わり---------
print item,"\n"
}

投稿日時 - 2007-06-08 12:21:41

お礼

tatsu99さん、ありがとうございます。
理解できました。

投稿日時 - 2007-06-10 22:09:17

ANo.2

next unless FileTest.Directory?(item)

で、itemがディレクトリでない場合次に行きます。

投稿日時 - 2007-06-07 13:11:28

補足

ありがとうございます。試して見ました。
結果は、フォルダネームのみならず、 .及び..が出てきてしまいました。
この.、..をスキップする方法はあるでしょうか?

投稿日時 - 2007-06-08 01:14:47

ANo.1

ディレクトリでないなら、スキップするようにします。
Dir.foreach('C:/Data'){|item|
item.chomp!
--------下記文を挿入------------
if !FileTest.directory?(item)
 next
end
--------挿入終わり---------
print item,"\n"
}

投稿日時 - 2007-06-06 23:36:57

補足

ありがとうございます。試して見ました。
結果は、フォルダネームのみならず、 ..が出てきてしまいました。
この..をスキップする方法はあるでしょうか?

投稿日時 - 2007-06-08 01:13:02

あなたにオススメの質問