ツリーの実装

yuki_endo2005-06-10

ツリーの実装をしてみた。
実装していて思ったけど、多くのファイラにおけるツリーの監視・更新処理は
とてもアバウトなようだ。
実際のフォルダ構造とツリーが異なっていることがままある。
もちろん、速度などを考えるとそれが現実的なのかもしれないが、
可能ならば、TreeViewに登録されているフォルダは全て監視対象にしたい。
その実現性を調べてみた。


今、SHChangeNotifyRegisterを使っているけど、アバウトな監視しかできない。
例えばフォルダを作る場合、エクスプローラから作るとSHCNE_MKDIRは発生するが、
mkdirから作るとSHCNE_MKDIR発生しない。
エクスプローラのみ発生するのはSHChangeNotifyをcallしているからだろうけど。


mkdirの後にSHCNE_UPDATEDIRが発生するのでこれで監視できないかと考えたけど、
きちんとした手がかりを得られないので更新に時間がかかりすぎるかも。


あと、試しているうちに気づいたけど、エクスプローラのツリーの挙動はすごい。
例としてD:\hogeというフォルダのノードが展開されている場合に、
D:\hogeにmkdirでフォルダを追加する場合について書く。
ツリーでD:\が選択されている場合、追加したフォルダを検知できる。
C:\が選択されている場合、追加したフォルダを検知できない。
ここまでは良いのだが、こちらのプログラムでSHChangeNotifyRegisterを使って
D:\を監視し始めると、C:\が選択されている場合でも追加したフォルダを検知できる。
...どうなってるんでしょ?


ReadDirectoryChangesWについては、こちらの期待通りに動作する。
これを使うのも良いかもしれないが、検知が細かすぎるか?