日韓共同Squeaker夜の集い
2008 Masashi Umezawa
FileManとは?
 日常良くある仕事-ファイル操作をSmalltalk
で簡単に行わせるための拡張ライブラリ
 小さい
 簡単
 ポータブル(Squeak, VisualWorks)
 拡張も楽
Squeakでのファイル操作
 もともとファイルを操作するためのライブラリ
群はある
 FileStream、FileDirectory、FilePathなど
 ではなぜFileManなのか?
 もともとのクラス群の作りがいまいち
○ ごちゃごちゃしている
○ 書き方も冗長になりがち
○ もっと簡単に使えるようにできるはず
 => FileManの開発がスタート
入手方法
 Squeak
 SqueakMap (Stable)
○ http://map.squeak.org/package/f9917683-25da-
4a6c-a013-b36527a100c1
 SqueakSourceJ (Current)
○ http://squeaksource.blueplane.jp/FileMan.html
 VisualWorks
 Cincom Public Store Repository
サンプルコード
 カレントディレクトリ下に’subDir’というディレクトリを
作り、そこに’Hello!’と書かれた’ file1.txt’というテキ
ストファイルを作る
 通常は
 FileManでは
subDir := FileDirectory default directoryNamed: 'subDir'.
subDir assureExistence.
[str := subDir newFileNamed: 'file1.txt'.
str nextPutAll: 'Hello!']
ensure: [str close].
'./subDir' asDirectoryEntry at: 'file1.txt' put: 'Hello!'
FileManの利点 (1)
 小さい
 コアとなるクラスは3つのみ
○ FmFileEntry
 ファイルを表す
○ FmDirectoryEntry
 ディレクトリを表す
○ FmFileIOAccessor
 低レベルのファイルIOへのアダプタ
(移植時を除き普段は意識しない)
FileManの利点 (2)
 簡単
 ファイルとディレクトリはオブジェクト
○ ファイルに、更新日は? サイズは? 内容は?
○ ディレクトリに、子供となっているファイルは? ディレクト
リは?
 などと聞けばよい
 ディレクトリは辞書のように扱うことも出来る
○ キーがファイル名で、値がファイルの内容となる
○ #at:でファイル内容の取り出し、#at:put:で書き込み
FileManの利点 (3)
 ポータブル
 パスの記法はプラットフォームに依存しない
○ ‘.¥subDir¥subSubDir’ asDirectoryEntry
と書いた場合
 Win、Mac、Linuxともに動作する
- セパレータの違いを吸収する
○ ‘/tmp’ asDirectoryEntry at: ‘myData’ put: data
 と書いても
- やはり全てのプラットフォームで動作
- ドライブの有無も自動で判断
FileManの利点 (4)
 拡張可能
 FmDirectoryEntryやFmFileEntryを継承すれば特殊
な振る舞いをディレクトリやファイルに追加できる
 例: 自動圧縮・展開
○ #at:put:すると’text.gz’ファイルが自動的に作られる
○ #at:で’text.gz’が展開される
| dir |
dir := './gzipped' asDirectoryEntry: FmGZipDirectoryEntry.
dir at: ‘text’ put: ‘これは圧縮されます'.
(dir at: 'text') inspect.
利用例 (1)
 バックアップ
 ‘foo’ディレクトリ以下のファイル群を日ごとに
’bkUp’ディレクトリ以下にバックアップしたい
'./foo' asDirectoryEntry copyTo: './bkUp' / Date today yyyymmdd
利用例 (2)
 エラーログ
 ‘error.log’ファイルに、エラーログ情報を追加で
書き込みたい
‘error.log’ asFileEntry appendContents: ‘エラー...’
利用例 (3)
 古いファイルの整理
 ‘foo’ディレクトリ以下のファイルで、拡張子が.txtで
100日ほど更新していないものを削除したい
dir := './foo' asDirectoryEntry.
current := TimeStamp current .
dir allFilesDo: [:file |
((file extension = 'txt') &
((TimeStamp fromSeconds: file modificationTime) plusDays: 100)< current)
ifTrue: [file delete]
].
利用例 (4)
 テキストファイル変換
 改行コードがCRで、UTF-8のテキストファイルを、CRLF
を改行コードにして、さらにShift-JISに変換したい
conv := [:in :out |
out wantsLineEndConversion: true; lineEndConvention: #crlf;
converter: ShiftJISTextConverter new.
out nextPutAll: (in upToEnd)
].
dir := './foo' asDirectoryEntry.
dir filesDo: [:file |
file pipe: conv to: (dir / (file name copyReplaceAll: '.txt' with: '.sjis.txt'))
]
まとめ
 FileManをつかうと
 とにかく簡単にファイルやディレクトリを操作できる
 日常の業務にお使いください

FileManで楽々ファイル操作