忍者ブログ
MASTER →  ADMIN / NEW ENTRY / COMMENT
現代魔法(nearly equal 情報技術)を勉強中な人のメモ(チラシの裏)
/ 2017/04/30 (Sun) / 編集
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

/ 2007/12/16 (Sun) / 編集
さて、UNIX実験のついでにSpotlightのコメントについてしらべてのでメモっておく

保存場所

SpotlightのコメントはLeopardからは「EA (Extended Attributes)」という領域に保存されているらしい
EAというのはLeopardのHDDのフォーマットであるHFS+の機能の一つで、ファイル付加情報(いわゆるメタデータ)の一種で、「ファイル名」「パーミッション」「ファイル作成日」以外の様々な情報が記録されている領域らしい。
Finder情報は「com.apple.FinderInfo」、リソースフォークは「com.apple.ResourceFork」、その他の情報は「com.apple.metadata」という名前のEAの一部として記録されるらしい。
だもんでHFS+以外のファイルシステムにファイルをコピーするとこれらの情報(Spotlightコメントとか)は消え去る(「AppleDouble」とかいう機能で「._元のファイル名」という形式の別ファイルに書き出される)らしい。

内容を見てみる

Spotlightコメントを確認するには「プログラムで実装して確認する」「Finder.appの「情報を見る」で確認する」「コマンドラインで確認する」という三通りの方法がある(もっとあるかもしんない)
というわけでコマンドで確認&設定する方法をメモる

まず、事前にファイルにSpotlightコメントを追加しておく、でもって「ls -l」するとLeopardからは
[:~/Pictures/GOSICK]%ls -l
total 648
-rwxrwxrwx@ 1 e055717 staff 17232 12 7 2006 GOSICK1.jpg
-rwxrwxrwx@ 1 e055717 staff 27113 12 7 2006 GOSICK2.jpg
-rwxrwxrwx@ 1 e055717 staff 64439 12 7 2006 GOSICK3.jpg
-rwxrwxrwx@ 1 e055717 staff 22908 12 7 2006 GOSICK4.jpg
-rwxrwxrwx@ 1 e055717 staff 55067 12 7 2006 GOSICK5.jpg
-rwxrwxrwx@ 1 e055717 staff 39364 12 7 2006 GOSICK6.jpg
-rwxrwxrwx@ 1 e055717 staff 64045 12 7 2006 GOSICKs.jpg
-rwxrwxrwx@ 1 e055717 staff 26439 12 7 2006 GOSICKs2.jpg
みたいな表示になってるのだが、「-rwxrwxrwx@」の部分の「@」がEA情報があるという意味らしい
そこで「ls -l@」をすると
[:~/Pictures/GOSICK]%ls -l@ GOSICK1.jpg
-rwxrwxrwx@ 1 e055717 staff 17232 12 7 2006 GOSICK1.jpg
com.apple.metadata:kMDItemFinderComment 48
みたいのがでるが、この「com.apple.metadata:kMDItemFinderComment」というのがEA情報の名前なんだとさ

なのでこんどは「com.apple.metadata:kMDItemFinderComment」になにが入っているか見てみる、「xattr」コマンドを利用して
[:~/Pictures/GOSICK]%xattr -p com.apple.metadata:kMDItemFinderComment GOSICK1.jpg
bplist00VGOSICK
うん、ちゃんと設定したSpotlightコメントが見れてる(なんか前半に「bplist00V」とかついてるのはなんだろ?)

内容を変更してみる(コマンド編)

というわけで次は変更のしかたについて、もちろんFinderの「情報を見る」からでもできるけどここはコマンドで
「xattr」の使い方は
usage: xattr [-l] file [file ...]
xattr -p [-l] attr_name file [file ...]
xattr -w attr_name attr_value file [file ...]
xattr -d attr_name file [file ...]

The first form lists the names of all xattrs on the given file(s).
The second form (-p) prints the value of the xattr attr_name.
The third form (-w) sets the value of the xattr attr_name to attr_value.
The fourth form (-d) deletes the xattr attr_name.
らしいのでためしてみると
[:~/Pictures/GOSICK]%xattr -p com.apple.metadata:kMDItemFinderComment GOSICK1.jpg
bplist00VGOSICK
[:~/Pictures/GOSICK]%xattr -w com.apple.metadata:kMDItemFinderComment testComment GOSICK1.jpg
[:~/Pictures/GOSICK]%xattr -p com.apple.metadata:kMDItemFinderComment GOSICK1.jpg
testComment
[:~/Pictures/GOSICK]%xattr -d com.apple.metadata:kMDItemFinderComment GOSICK1.jpg
[:~/Pictures/GOSICK]%xattr -p com.apple.metadata:kMDItemFinderComment GOSICK1.jpg
No such xattr: com.apple.metadata:kMDItemFinderComment
おぉ〜 できてるよ!

内容を変更してみる(システムコール編)

まぁまだ試していないがシステムコールから操作する方法もメモっておく

まずEAの名前のリストを取得するには「listxattr」関数を使うらしい
#include
ssize_t
listxattr(const char *path, char *namebuf, size_t size, int options);
ssize_t
flistxattr(int fd, char *namebuf, size_t size, int options);
path(またはfd(ファイルディスクリプタ?))で指定したファイルに記述されているEAの名前をsizeバイトのnamebufに格納するらしいよ?詳細は「man」コマンドで調べましょう

次に内容の取得は「getxattr」内容の設定は「setxattr」でやるらしい
#include

ssize_t
getxattr(const char *path, const char *name, void *value, size_t size, u_int32_t position, int options);

ssize_t
fgetxattr(int fd, const char *name, void *value, size_t size, u_int32_t position, int options);

#include

int
setxattr(const char *path, const char *name, void *value, size_t size, u_int32_t position, int options);

int
fsetxattr(int fd, const char *name, void *value, size_t size, u_int32_t position, int options);
ちなみに、これらの関数で使う文字コードはUTF-8らしいよ?


しかしObjective-Cでの関数が見当たらんのだがObjective-Cでは設定できんのか?

参考文献:
Undocumented Mac OS X:第11回 HFS Plus独自の機能【後編】 (2/2) OS X ハッキング!(253) Leopard解体新書(4) ~拡張された拡張属性~ [Appleの公式ページ]filesystem_examples

拍手[1回]

PR
忍者ブログ [PR]