You are here: Home / TinBlog / オートマタ、使って天国、作って地獄 orz part.3

オートマタ、使って天国、作って地獄 orz part.3

Posted by h2 at Apr 09, 2013 01:26 AM |
Filed under:
プログラム開始以前の問題で、さんざん足踏みを強いられたものの、ようやく本命のプログラム「ファイルの列挙」と「ファイルの削除」がまとまった。

アップルのお約束で、最初の一歩が途轍もなく踏み出しにくい位置にあったわけだけど。どうにか雛形の中身が見渡せたので、まずは「オートマタでファイルの列挙」からプログラミング行ってみよう。

 

といっても、ファイルの列挙自体は、大抵のプラットフォームやプロジェクトでよくやる作業だし、難しいプログラムでもない。ましてや、OSXのフレームワークには、ご丁寧にもファイル列挙に関する大変便利な関数があったりするわけで。曰く、

enumeratorAtPath:
Returns a directory enumerator object that can be used to perform a deep enumeration of the directory at the specified path.
---NSFileManager Class Reference#enumeratorAtPath

このメソッドは、一発でディレクトリの全てのファイルを列挙してくれる。それだけでなく、サブディレクトリがあれば、そのなかのファイルも全部列挙してくれるので、通常の用途ではかなり重宝する便利メソッドだ。

だが。今回に関しては、「サブディレクトリを列挙するかどうか」等々を細かく制御したいので、代わりにこちらを利用。

contentsOfDirectoryAtPath:error:
Performs a shallow search of the specified directory and returns the paths of any contained items.
---NSFileManager Class Reference#contentsOfDirectoryAtPath

こちらのメソッドは、enumeratorAtPath:とは異なり、サブディレクトリの中身までは列挙しない。また、列挙に失敗した場合のエラーも拾うことができるので、今回の追加目的に合致するのだ。制限としては、リソースフォークに絡むファイル('._'で始まるファイルだが、ファインダーなどで見ることはできない)は拾わないんだけど、今回については、リソースフォークを独立して扱わせるつもりは無いので、これで十分。

 

あとは、シンプルイズベストな設定用インターフェースをこしらえて、

オートマタアクション作成#10

ファイル列挙のメソッドを、サブディレクトリ列挙の有無に合わせてリカーシブコールしてやれば、基礎部分の出来上がり。

次に、ファイル列挙時にエラーが生じた場合だが、通常のエラーはともかく、パーミッションに絡むエラーについては、対処可能なようにしておきたい。パーミッションに関する、というのは、ファインダーで表示させたところの

オートマタアクション作成#11

こいつ。フォルダーに一方通行マークが付いていて、読み書きに管理者権限を要求されるようなファイルやフォルダーのこと。普通にOSX利用している人にはまず縁は無いだろうけど、開発絡みではパーミッション込みで作業したい場面が往々にして出てくるのですよ。

このようなフォルダーに対して、 NSFileManagerのファイル列挙メソッドを呼び出すと、NSFileReadNoPermissionError付きで失敗を返す。なので、とりあえずは、無視して続行するか中断するかを選べるようにしておく。

オートマタアクション作成#12

こんな感じ。この部分は、あとあと拡張して、認証付きで作業を続行させるかどうかも選べるようにする予定だけど。

 

つづいて、同じ要領で、「ファイルの削除」アクションも作成。

単にファイルをremoveするだけなので、特にトラブルも無く完成する。

 

さて、以上で一揃いのアクションが・・・と言いたいところなんだけど。これだけだと、実際にオートマタで利用するにあたり、一つ問題が出てくる。他でも無い、上でパーミッションエラーが発生した時に、「継続」できるようにしたことに絡むのだが、オートマタで用意されているアクションの大半は、パーミッションエラーが出た段階で強制停止してしまうのだ。

このままでは、アクションの利用が大幅に制限されてしまうし、最低限、パーミッションに耐性があるフィルターアクション(「Finder項目にフィルターを適用」に相当するアクション)は欲しいところ。というわけで、急遽フィルターアクションの作成もすることにしたのだけど。

これについては、また次回。

Filed under:
« June 2019 »
June
SuMoTuWeThFrSa
1
2345678
9101112131415
16171819202122
23242526272829
30