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

Applescriptで選択したファイル名のバイト数を求める事が可能か?

発言者:yabuki
( Date Monday, February 14, 2000 19:26:41 )


最近Applescriptを勉強しています。
純粋にApplescriptで選択したファイルのファイル名のバイト数を求めたいのですが、可能でしょうか?誰か分かる方がいましたら、教えて下さい。お願いします。
(純粋にとは「スクリプティング機能追加」に何も入れないで、通常OSに付いてくる「スクリプト編集プログラム」のみの記述での事です)

Tanaka's osaxを使うと簡単にできるのに...
(まだ勉強中なので、これから重宝させて貰います)

Junnama さんからのコメント
( Tuesday, February 15, 2000 15:22:31 )

もっとスマートな方法があるのかもしれませんが...

不細工な方法ですが、1文字ずつASCII numberを調べて
127以上であれば2バイト
そうでなければ1バイト

で、延々足していけばできるかも。
ファイル名くらいなら何とか実用的になるかもしれません。

長い文字列なら一旦テキストファイルに保存してからサイズを求めるという手も
ありますね。

yabuki さんからのコメント
( Tuesday, February 15, 2000 18:44:48 )

Junnamaさん、ありがとうございます。
早速ためしてみたら無事にできました。
ASCIIコードの意味自体が良く分からないので勉強になりました。

ちょっと分からないのは127以上ならば
2バイトを示すというのは決まり事なのですか?

yabuki さんからのコメント
( Tuesday, February 15, 2000 19:05:37 )

ASCIIコードを使ってテストをしていたところ、
ファイル名が半角カタカナの時にうまくいきませんでした。
(例:「テストダ」というファイル名の ASCIIコードを調べると
「195:189:196:192:222」になりました。)

つまり127以上でも1バイトの文字があるみたいなので
うまくいきませんでした。

Junnama さんからのコメント
( Tuesday, February 15, 2000 19:41:08 )

>ファイル名が半角カタカナの時にうまくいきませんでした。

どっかで読んだか見た気がしていたのですが、なんか根本的に違ってた
かもしれません、すいません。
しかし、半角カナがくるとは思ってませんでした。

となるとあとはテキスト保存かなぁ...

何かのアプリケーションでフォントを英文フォントに無理矢理して文字
を数えるってのではだめでしょうか...だめでしょうねぇ

野本夏俊 さんからのコメント
( Tuesday, February 15, 2000 20:40:47 )

set TXT to "123123一二三イチニサン"

ByteLength(TXT) = (MT Byte Length TXT)

on ByteLength(TXT)
  set x to 0
  repeat with i in TXT
    if (ASCII character (ASCII number (contents of i))) = contents of i then
      set x to x + 1
    else
      set x to x + 2
    end if
  end repeat
  x
end ByteLength

↑で、できます。

yabuki さんからのコメント
( Wednesday, February 16, 2000 09:47:56 )

>set TXT to "123123一二三イチニサン"
>
>ByteLength(TXT) = (MT Byte Length TXT)
>
>on ByteLength(TXT)
>  set x to 0
>  repeat with i in TXT
>    if (ASCII character (ASCII number (contents of i))) = contents of i then
>      set x to x + 1
>    else
>      set x to x + 2
>    end if
>  end repeat
>  x
>end ByteLength
>
>↑で、できます。

野本夏俊さんコメントありがとうございます。
早速試してみましたが、repeat with i in TXTから end repeatのところで、
エラーが起きてしまいます。(エラーメッセージも良く分かりませんでした)

下記のようにしたら

set TXT to "123123一二三イチニイサン"
tell application "スクリプト編集プログラム"
  set totalByte to (MT Byte Length TXT) 
  -- Tanaka's osax 2.0を使用しています。
end tell
display dialog totalByte

↑でできました。

また私が悩んでいる事はASCIIコードからバイト数を求める事ではなく、
「スクリプティング機能追加」に何も入れないで、
通常OSに付いてくる「スクリプト編集プログラム」のみの記述で
選択したファイル名のバイト数を求める方法があるのかが知りたいのです。
(わがままな質問にコメントしてくれるJunnamaさんや野本夏俊さんには
非常に感謝しています)

Junnama さんからのコメント
( Wednesday, February 16, 2000 12:27:29 )

>「スクリプティング機能追加」に何も入れないで、

思いつきでやってみたら以下の方法でできてしまいました。

set the clipboard to "123123一二三イチニサン"
item 2 of item 1 of (clipboard info)

-->結果:25

半角カタカナもOKです。

MacOS8.5はまだ日が浅いので盲点でした。

yabuki さんからのコメント
( Wednesday, February 16, 2000 15:13:59 )

>思いつきでやってみたら以下の方法でできてしまいました。
>
>set the clipboard to "123123一二三イチニサン"
>item 2 of item 1 of (clipboard info)
>
>-->結果:25
>
>半角カタカナもOKです。
>
>MacOS8.5はまだ日が浅いので盲点でした。

Junnamaさん、早速テストしてみました。
MacOS8.5以降のものでは、問題ありませんでした。

しかし、私のMacは7.5.5なのです。
(つまりOS8.1より低いものはダメという結果なんですね)

もはやOSを上げるしか手はないような気がしてきました。
本当にいろいろありがとうございました。

Junnama さんからのコメント
( Wednesday, February 16, 2000 16:17:32 )

少し意地になってきました(笑)。

tell application "Finder" to set targetFolder to preferences folder as string
--初期設定フォルダの位置を知る
set CountText to "123123一二三イチニサン"
set CountByte_File to targetFolder & "CountByte.txt"
   --初期設定フォルダにファイル"CountByte.txt"を作る準備
open for access file (CountByte_File as string) with write permission
write CountText to file (CountByte_File as string)
   --CountTextをファイルに書き込む
set CountByte to get eof file (CountByte_File as string)
   --"CountByte.log"の終了位置=バイト数を得る
   --またはファイルのサイズを得るコマンドがあったと思います。
set eof of file (CountByte_File as string) to 0
   --カウント後ファイルを空にする(次の処理への準備)
close access file (CountByte_File as string)
CountByte   --25が返る

現在MacOS8.5で確認しましたが、8.5以降のコマンドは特に使っていま
せんので(多少の修正はあるかも)これなら動くと思います。

野本夏俊 さんからのコメント
( Wednesday, February 16, 2000 20:18:16 )

>早速試してみましたが、repeat with i in TXTから end repeatのところで、
>エラーが起きてしまいます。(エラーメッセージも良く分かりませんでした)

まともな環境ではエラーは起きません。
最初から入っているスクリプティング機能追加ファイルまで外しているのなら
ぼくが書いたスクリプトは動きません。

>また私が悩んでいる事はASCIIコードからバイト数を求める事ではなく、
>「スクリプティング機能追加」に何も入れないで、
>通常OSに付いてくる「スクリプト編集プログラム」のみの記述で
>選択したファイル名のバイト数を求める方法があるのかが知りたいのです。

そのような方法はありません。
あるとすれば、システムを英語版に置き換えるぐらいですね。

yabuki さんからのコメント
( Thursday, February 17, 2000 09:57:40 )

Junnamaさん、無事に出来ました。

説明付きで記述して頂いて、とても分かりやすいので助かります。
少し諦めていたので、本当に嬉しいです。
今回の事でいろいろと勉強になりました。本当にありがとうございます。

yabuki さんからのコメント
( Thursday, February 17, 2000 10:17:32 )

>まともな環境ではエラーは起きません。
>最初から入っているスクリプティング機能追加ファイルまで外しているのなら
>ぼくが書いたスクリプトは動きません。

スクリプティング機能追加ファイルは
1.Appleガイド起動 2.GMT時差 3.Jonユs Commands 4.Tanaka's osax 5.Tanaka's osax 2.0
6.アプリケーションを選ぶ 7.スクリプト・コンポーネント 8.ストアする 9.ビープ
10.ファイルを選ぶ 11.ファイル命令 12.モニタ階調設定 13.ロードする 14.音量設定
15.現在の日付 16.実行する 17.新規ファイル 18.数値計算 19.読み書き命令
20.表示する 21.文字列命令
↑このようにファイルが入っています。

OSは7.5.5です。エラーメッセージは「false doesn't understand the
count message.」とでてしまいます。

どのスクリプティング機能追加ファイルが足りないのか分かりません。
教えて頂けますか。

田中求之 さんからのコメント
( Friday, February 18, 2000 12:44:45 )

野本さんのスクリプトは、正確には、以下のようなハンドラです。

on ByteLength(TXT)
  set x to 0
  repeat with i in TXT
    if (ASCII character (ASCII number (contents of i))) = contents of i then
      set x to x + 1
    else
      set x to x + 2
    end if
  end repeat
  return x
end ByteLength

このハンドラをつかって、以下のような感じでファイル名のバイト数が
求まります。

set myFile to choose file
set myname to name of (info for myFile)
set myByte to ByteLength(myname)

--- このとき myByte にバイト数

yabuki さんからのコメント
( Friday, February 18, 2000 13:01:41 )

田中さん、うまくファイル名のバイト数を求められました。
ありがとうございます。