差分FTPを考える(3 – 前回のディレクトリ状態を保存する方法

基本的には毎回ファイルリストを取って保存しておき、
前回にとったファイルリストのうち

  • 変更されたファイル
  • 新しく追加されたファイル

がわかればいいということになります。
単純にファイルリストを作っておいて単純に突き合わせをする方法もありますが、
Perlでやるのならもっといいやり方があります。

DBM?

パスに対するファイルは一意で決まるので、パスをキーにして、値をcksumの値を入れたハッシュとしてとっておけば比較が楽そうです。
このようなハッシュ値を取っておくにはDBMが便利です。

dbmopen %HOGE, "db" ,0644 or die "dbm open error";
~
~
dbmclose %HOGE;

この%HOGEがハッシュとして使え、ファイルとして吐き出します。
そのため、次回起動時にも保存できるというわけです。
この機構にはロック機構がありません。なので自前でロックする仕組みをつけたほうが無難です。

簡易的なDBですので、変更を破棄することが出来ません。この点が少し使いづらいな、と思っていました。

Storeableを使う

実は非常にこのDBMと似ているのですが、もう少し使いやすいStoreableというのがあります。

use Storable qw(nstore retrieve);
#### Read
@atmp=@{ retrieve("adata.dat") };
%htmp=%{ retrieve("hdata.dat") };

#
# 処理
#
#### Write
nstore \@atmp , $adata;
nstore \%htmp , $hdata;

変数の内容をファイルから開くのがReadで、書き込むのがWriteです。
これが特徴的なのは、配列や変数でも保存できることです。
上の例は配列とハッシュの例を書きましたが、変数でも可能です。$に変更するだけです。
それと、オープン・クローズ、の概念がないので、扱いが楽です。
変数の内容を変更しても、nstoreを実行しない限りは保存されているファイルはそのままです。
なので、変更結果を繁栄したくない場合はnstoreを実行しなければいいだけです。

次回は具体的にこのStoreableを使って見たいと思います。