API FindFirstChangeNotification
delphi付属 ShellChangeNotifierコンポーネント
河邦 正さん作 'フォルダの内容を監視するコンポーネント'
クリムさん作 'フォルダ及びファイル変更監視 コンポーネント'
これらでは変更のあったことを監視できても
ファイルを特定することができません。
何か良い方法はありませんでしょうか?
なさそうですね。
地道に、フォルダ以下のファイル・フォルダのサイズおよび日付を保存しておき、変更がかかったらチェックして探すしか・・・。
上記の河邦 正さん作コンポーネントのChangeイベント
procedure TForm1.DirMonitor1Change(Sender: TObject);
var
SR: TSearchRec;
Res: Integer;
ListItem: TListItem;
DT: TDateTime; //更新時刻
Year, Month, Day,
Year2, Month2, Day2: Word;
begin
ListView1.Clear;
DecodeDate(Now, Year, Month, Day); //日付分解
Res := FindFirst(GetCurrentDir+'\*.*', faAnyFile, SR);
While Res = 0 do
begin
//対象がディレクトリのとき次へ
if SR.Attr = $00000010 then
begin
Res := FindNext(SR);
Continue;
end;
With ListView1.Items do
begin
DT := FileDateToDateTime(SR.Time); //更新時刻取得
DecodeDate(DT, Year2, Month2, Day2);
if Day = Day2 then
begin
ListItem := Add;
ListItem.Caption := SR.Name;
ListItem.SubItems.Add( DateToStr(DT) );
end;
//それ以外はスルー
end;
Res := FindNext(SR);
end;
FindClose(SR);
end;
いまこんな感じです。
TSearchRec型の
FindData: TWin32FindData;
が使えればもっとよくできそうです。
勉強してきます。
こんなツールがあるそうです。
http://www.vector.co.jp/soft/win95/util/se108867.html
特定の時期との比較にはサイズと日付を見るのが有効ですが
参考のため圧縮などの場合はCRC32値をとっておいて保存し比較して
データの破損のチェックをします。
しかし今回の場合はリアルタイムでチェックしているということなので
何もバックアップを取らなくても
変更イベント通知があったときにそのときのファイルの日付をスキャンして
10秒以内とか1分以内であれば
そのファイルが変更されたと考えてよいと思います。
つまりデータベース化されたファイルリストならば
時間で抽出すればよいということです。
FIMO等では制限がいろいろあるので自分でおなじことをやろうとしています。
ReadDirectoryChanges APIが使えそうなので調査しています。
ただし、HelpにはNew - Windows NTと書いてあります。
ツイート | ![]() |