ファイル世界との国交回復(その2)
ファイル世界との国交回復(その1) - みねこあ で 梅沢さんにコメントで紹介頂いたファイル操作ユーティリティ?FileManですが、ちょっと使っただけでも何ともツボを突いた仕様で非常に便利です。
インストール
http://map.squeak.org/package/f9917683-25da-4a6c-a013-b36527a100c1
から、mczファイルをダウンロードします。あとは Squeak の FileList で選択し、ロードするだけです。
使い方
FileMan は ファイル操作・ディレクトリ操作に新しいインターフェイスを追加します。百聞は一見にしかず、デフォルトディレクトリに対し "subDir" というディレクトリを作り、その中に "file1"を "Hello!" と言う内容で作成する、をFileMan適用前と後で比べてみましょう。
適用前
| subDir str | subDir := FileDirectory default directoryNamed: 'subDir'. subDir assureExistence. [str := subDir newFileNamed: 'file1'. str nextPutAll: 'Hello!'] ensure: [str close].
適用後
'./subDir' asDirectoryEntry at: 'file2' put: 'Hello!'
これまたえらく簡潔になったものです。実はこれはFmFileEntry の example1 にある例そのまんまなんです。他にも FmFileEntry のクラス側の examples カテゴリにいくつかの使用例があります。
FileMan の特徴の一つは、Dictionary風のインターフェイスを提供することです。例えばあるディレクトリ直下のテキストファイルをコピーするスクリプトを書いてみました。
| bkupDir | bkupDir _ './bkup' asDirectoryEntry. './foo' asDirectoryEntry filesDo: [ :file | bkupDir at: file name put: (baseDir at: file name) ]
もう一つは、Stringクラスへディレクトリ操作(?)メソッドが追加されることです。例えば上の例の #asDirectoryEntry なんかですが、特に面白くも便利と感じたのが / メッセージでディレクトリの連結が出来るようになるもの。
'./subDir' / 'hoge/piyo' / 'foo/var' / 'xyzzy' ' "==>" C:\Squeak3.8\subDir\hoge\piyo\foo\var\xyzzy
String のようなクリティカルなクラスに対しての拡張が、普通に出来て普通に配布可能なあたりが Smalltalk の魅力的なところです。(というか Smalltalker じゃないと、こんな手はやろうと思いつきさえしない^^;)
でも、この方法論に未だにちょっとした恐怖を感じてしまう猫はまだまだSmalltalkerじゃないんだなぁと思ったり。(そういえば、この怖さはそう言えば静的型付け言語ばっかりだった頃に初めて動的型付け言語を使った時と良くにてるなぁ)
バックアップスクリプトの作成(そして挫折)
せっかくの Squeak ですからコードの改変が Smalltalk の醍醐味!・・・と、ちょっと調子にのってFmDirectoryEntry にこんなメソッドを追加。
deepCopyTo: toDir | newToDir | self filesDo: [ :file | toDir at: file name put: (self at: file name) ]. self directoriesDo: [ :dir | newToDir := (toDir pathName / dir name) asDirectoryEntry. dir deepCopyTo: newToDir]
こんな感じで使います。
'./foo' asDirectoryEntry deepCopyTo: './bkup' asDirectoryEntry.
でもテキストファイルしかコピーできないし、テキストファイルでもShift-JIS な文字が含まれててもNGです。(UTF-8ならOK)・・・だめじゃん、あたし。そこはもちっと考えよう。
それ以前に、こういうことする奴はもう既にありそうな予感が激しくしますが(^^;)、そこは言わないお約束。(いえいえ言ってくれるとうれしいです)