このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

カスタムアイコンの削除

発言者:栗田哲郎
( Date Saturday, May 16, 1998 15:03:02 )


はじめまして、栗田ともうします。
昔(少なくともOS7.6.1以前では)カスタムアイコンの削除は
tell application "Finder"
  set icon of referenceToItem to {}
end tell
とやれば良かったと思います。

現在OS8.1を使っていますが、昔のscriptを引っ張り出して使おうとしたところ、
これをやるとerrorが起きます。
AppleScriptの仕様が変わったのでしょうか?

OS8.1でカスタムアイコンを削除するにはどうすれば良いのでしょう?

田中求之 さんからのコメント
( Saturday, May 16, 1998 20:47:58 )

確かに 8.0 では Finder のスクリプティングの仕様に細かい変更が加えられました。
カスタムアイコンの扱いもこの変更の一つのようですね。

もともとアイコンとカスタムアイコンとを区別せずに扱いますから、set icon .. to {}
がエラーになる(あるいはカスタムアイコンの削除にならない)のは筋が通っていると思い
ますが、かといってカスタムアイコンの削除ができないのも不便ですよね。

それらしいコマンドを一通り試したかぎりでは、カスタムアイコンを削除する方法は
私には分かりませんでした。

野本夏俊 さんからのコメント
( Sunday, May 17, 1998 11:32:37 )

7.6.1では
  set icon of referenceToItem to 0 や、
  set icon of referenceToItem to "" とやると、
「データのタイプが違う」とエラーになりますが、
8.1ではそれがありません。(単に無視するらしい)
バグと考えたほうがいいのかもしれませんね。

野本夏俊 さんからのコメント
( Sunday, May 17, 1998 13:05:47 )

画像をドロップ(複数可)するとフォント情報を書き出します。
エラー処理はしてないので画像以外をドロップしないように。
QXのスクリプトに組み込めば使えるかもしれませんよ。

property FontHeader : return & "%%DocumentFonts: "
property FontSep : return & "%%+ "

open {choose file}

on open FS
 set TXT to {}
 repeat with F in FS
  set end of TXT to GetFonts(F)
 end repeat
 set AppleScript's text item delimiters to return
 set Fref to open for access (new file default name "フォント情報") with write permission
 set eof Fref to 0
 write (TXT as text) to Fref
 close access Fref
end open

on GetFonts(F)
 open for access F
 set ILTXT to read F for 5000
 close access F
 set RTXT to F as text
 if FontHeader is in ILTXT then
  set AppleScript's text item delimiters to FontHeader
  set ILTXT to text item 2 of ILTXT
  set RTXT to {RTXT & tab & paragraph 1 of ILTXT}
  set ILTXT to return & (text from paragraph 2 to -1 of ILTXT)
  if ILTXT begins with FontSep then
   set AppleScript's text item delimiters to FontSep
   set ILTXT to text items of ILTXT
   repeat with i from 2 to count of ILTXT
    set Para to (item i of ILTXT) as text
    if return is in Para then
     set end of RTXT to paragraph 1 of Para
     exit repeat
    else
     set end of RTXT to Para
    end if
   end repeat
  end if
 end if
 set AppleScript's text item delimiters to return & tab
 return RTXT as text
end GetFonts
フォルダには使えませんが、GTQ Scripting Library 1.2.1の「Delete Resource」を使って、

property ResTypes : {"ICN#", "icl4", "icl8", "ics#", "ics4", "ics8"}

tell application "Finder"
  repeat with i in ResTypes
    delete resource from TGTITM of type i id -16455
  end repeat
end tell

とするとカスタムアイコン削除に近い結果になります。
「近い」というのは、たしかにアイコンが元に戻ってアイコンリソースも削除されますが、
ResEditで見てみると、「Use Custom Icon」属性はtrueのままです。
7.6.1では、この場合にはとりあえずはアイコンは変化せず、(カスタムアイコンのまま)
再起動すると、白紙のアイコンになります。「Use Custom Icon」属性をfalseにするか、
デスクトップを再構築しないかぎり、アイコンは元に戻らないようです。

また、フォルダのカスタムアイコンにも変化があります。
7.6.1では不可視の「icon」ファイルは、タイプ、クリエータともに空欄なのですが、
8.1ではタイプ「icon」クリエータ「MACS」となっています。

さらに、7.6.1ではフォルダのカスタムアイコンを削除しても「icon」ファイルの
リソースフォークはそのまま残る(アイコンリソースはきえる)ので、HDDの1ブロックを
消費しますが、8.1ではリソースフォークごと削除するので、ディスクスペースを消費しません。
(スクリプトで新規ファイルを作って、なにも書き込まずに閉じたのと同じ状態になる。)
ただしファイルのカスタムアイコンについては、他にリソースがなくてもリソースフォークの
削除はしないようです。

AppleScriptについてだけ変更があったのではなく、Finderのアイコンの扱そのものに
変更が加えられたみたいですから、AppleScriptの変更が追い付いていないだけかもしれません。
後のバージョンでは直るかもしれませんね。

野本夏俊 さんからのコメント
( Sunday, May 17, 1998 13:08:04 )

ありゃー 余計なものまでいれてしまいました。上の発言の

end GetFonts

までは無視してください。

栗田哲郎 さんからのコメント
( Sunday, May 17, 1998 13:10:04 )

そうですか。
どなたもご存じないですか。
どうもありがとう御座いました。
無念です。。。。。

田中求之 さんからのコメント
( Sunday, May 17, 1998 14:15:20 )

カスタムアイコンだけでなく、リソース丸ごと削除するのでよければ、Tanaka's osax
を使ってもらえば可能です(ちゃんとカスタムアイコンビットもクリアします)。

画像のファイルから、カスタムアイコンやプレビュー用のデータを削って、ファイルを
小さくするという場合は、これでいけます。


野本夏俊 さんからのコメント
( Sunday, May 17, 1998 16:21:03 )

>カスタムアイコンだけでなく、リソース丸ごと削除するのでよければ、Tanaka's osax
>を使ってもらえば可能です

これはデータフォークを読み出してから、もとファイルを削除してから、
新規ファイルに書き出し、位置と名前タイプクリエータを戻すようにしても
同じことができますね。元のファイルがごみ箱に残りますが、安全性を考えれば、
このほうがいいかもしれません。(もっとも事前に複製しておけばいいだけか...)
同様のスクリプトをSHUICHI.Tさんが作っています。
http://www.sh.rim.or.jp/~shuichi/AppleScript/index.shtml

>ちゃんとカスタムアイコンビットもクリアします

だとしたらGTQでリソースを全部読み出してから、MT Zap Resource
でリソースを削除して、カスタムアイコン以外を元に戻せば
実現可能かもしれませんね。
めんどくさそうだから、誰もやらないかもしれませんけど...

Tanaka's osaxはリソース関連がだいぶ汎用化されたんですね。
MT Load Resourceはあとで加わったものなんですか?

野本夏俊 さんからのコメント
( Sunday, May 17, 1998 16:30:11 )

>MT Load Resourceはあとで加わったものなんですか?

自己レス。b7ですね

栗田哲郎 さんからのコメント
( Monday, May 18, 1998 00:41:18 )

カスタムアイコンビットを操作する事はできないでしょうか?そうすれば、Resouce
を扱うOSAXを駆使してカスタムアイコンの削除が出来ると思います。無理ですか
ね。。。

田中求之 さんからのコメント
( Monday, May 18, 1998 04:17:16 )

Quick & Dirty に (^_^;; カスタムアイコンを削除する osax を作ってみました。

カスタムアイコンビットが立っているファイルから ID -16455 のアイコンファミリー
を削除し、カスタムアイコンビットをクリアします。また、もしカスタムアイコン以外の
リソースを持っていなかったファイルの場合は、リソースフォークも削除します。

とりあえず動きます (^_^;;

on open(f)
  MT Zap Custom Icon f
end open

というドロップレットを作ってもらうと、ドロップしたすべてのファイルからカスタム
アイコンを削除します。


→  Zap_Custom_Icon.hqx

栗田哲郎 さんからのコメント
( Monday, May 18, 1998 14:47:58 )

す、すばらしい・・・・
試させて頂いたところ、Folderは処理できないようで。
Folderも処理できれば完璧です。

田中求之 さんからのコメント
( Monday, May 18, 1998 15:27:50 )

フォルダーには対応してません。

フォルダーの時には ICON<CR> という不可視のファイルを探して、それを削除して
からビットをクリア、ということで、ちょいと動作が異なるためです。

ファイルの場合は、MT Zap Resource をちょいと書き換えれば出来上がりだった
ので、すぐ作れたわけです (^_^;

とりあえず、ファイル用ということで使ってくださいな。

栗田哲郎 さんからのコメント
( Monday, May 18, 1998 16:29:51 )

では、将来フォルダにも対応される事を期待しつつ、
ありがたく使わせて頂きます。
当面の自分の目的には、ファイルだけで用が足りますので。
本当にありがとう御座いました。