RubyOSA_0.4.0 がリリースされてたので試してみました。
http://rubyosa.rubyforge.org/
%cat README
== Requirements ==
Mac OS X 10.4.X or greater
ruby 1.8.X or greater
libxml-ruby 0.3.8 or greater
とのことなので、libxml 0.4 もインストールしてます。
http://libxml.rubyforge.org/index.html
#libxml がインストールされてない場合は、REXML を使うと確かFAQにあったようななかったような気もしつつ...
早速、RubyOSA 0.4.0 Finder用のサンプル。でもなぜか動かないです...
%cat show_desktop.rb
# Lists the content of the Finder desktop.
begin require 'rubygems'; rescue LoadError; end
require 'rbosa'
ary = OSA.app('Finder').desktop.entire_contents.get
ary.each do |x|
next unless x.is_a?(OSA::Finder::Item)
puts "#{x.class.name.sub(/^.+::/, '').sub(/_/, ' ').ljust(25)} #{x.name}"
end
結果
RuntimeError: application returned error: Runtime resolution of an object failed. (-1728)
method __send_event__ in rbosa.rb at line 558
method name in rbosa.rb at line 558
at top level in show_desktop.rb at line 9
method each in show_desktop.rb at line 7
at top level in show_desktop.rb at line 7
Finder::Item にアクセスして item.name をとるところで 止まる...
p finder.desktop.methods を表示してなにが使えるか探してみたら...
items があったので
#ary = OSA.app('Finder').desktop.entire_contents.get
ary = OSA.app('Finder').desktop.items.get
に、したら動いた.
# =>
Disk tiger
Disk midori
Folder rubyosa
items.get の .get がないと Disk も Folder も全てのアイテムは Itemクラス になってしまうのね。.get 要注意。
それにしても entire_contents は使われてないという意味なのだろうか?。
とりあえず理解を深めるためにもデスクトップをターゲットに頑張ってほりさげて...
デスクトップフォルダ以下全てのフォルダ名とファイル名の取得
# ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.9.1]
# rubyosa-0.4.0
require 'rbosa'
OSA.utf8_strings = true
finder = OSA.app('Finder')
def getfiles(obj)
print "Folder::#{obj.url.gsub("file://localhost",'').scan(/\/Desktop.*/)}\n"
obj.items.each{|i|
case i.get.class.name
when "OSA::Finder::DocumentFile"
puts "File:: #{obj.name}/#{i.name}"
end
}
my_index(obj.folders)
end
def my_index(obj)
obj.each{|x|
case x.get.class.name
when "OSA::Finder::Disk": puts "Disk:: #{x.name}"
when "OSA::Finder::Folder": getfiles(x)
when "OSA::Finder::DocumentFile": puts "File:: #{x.name}"
end
}
end
my_index(finder.folders)
結果
Disk:: tiger
Disk:: hd
Folder::/Desktop/rbosa/
File:: rbosa/rbosa_test.rb
File:: rbosa/名称未設定.txt
Folder::/Desktop/rbosa/memo/
File:: memo/memo.rb
File:: memo/memo_in_ruby_2.zip
Folder::/Desktop/rbosa/memo/data/
File:: data/data.txt
なんとか再帰的にとれました。
#entire_contents を利用する方法はわからずじまい。
x.get.class.name っていうところはちょっとはまりました。やっぱり .get 要注意。
OSA::Finder::Folder クラスに属するオブジェクト
require 'rbosa'
OSA.utf8_strings = true
finder = OSA.app('Finder')
finder.desktop.folders.each{|i| p i.name}
puts "-----\n"
finder.desktop.folders.each{|i| p i.name if i.kind =~ /ボリューム/}
# i.kind => ボリューム or フォルダ
finder.desktop.folders.each{|i| p i.name if i.properties[:class].name =~ /Folder/ }
# i.properties[:class].name => "OSA::Finder::Disk" or "OSA::Finder::Folder"
--telop
曇り
--imported_from
http://www.midore.net/daybook/2007/04/1176460414.html
+++ 追記 +++
2010-02-06
関連する記事
"RubyOSA"ラベルがついた全ての記事
0 件のコメント:
コメントを投稿