2007/04/13

RubyOSA_0.4.0_OSA::Finder::Folder

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"ラベルがついた全ての記事

2007/04/12

バッテリー

バッテリー残時間が一瞬556時間って出た。こわいよ。
--telop
曇り

--imported_from
http://www.midore.net/daybook/2007/04/1176369389.html