TortoiesSVNの管理するフォルダの一覧を表示して、簡易的にプロジェクトの管理を行
うツールを作成しております。
(オーバーレイアイコンのインデックスを取得することで、ファイルの現在のステー
タスが判別可能なことを利用)
ファイルなどの情報が更新されたという通知には、以下の3種類のAPIが存在している
と思います。
FindFirstChangeNotification()
SHChangeNotifyRegister()
ReadDirectoryChangesW()
しかしながらTortoiesSVN管理下で何らかの作業を行って、オーバーレイアイコンが変
化したとしても、これらのAPIで検出することができませんでした。
オーバーレイアイコンの走査を定期的に行えば検出は可能ですが、エクスプローラが
そんなことをやってるとは思えませんし、リアルタイムで追従できるものではありませ
ん。
何か方法は無いものでしょうか?
環境:VS2010/2008 WindowsVista/7/XP
●SHChangeNotifyRegister系
//全てのシェル通知イベントを受信する
SHChangeNotifyEntry const entries[] = {pidlWatch, TRUE};
//entriesの指定は、pidlWatchにはデスクトップのITEMIDLIST、下位階層まで取得
int const nSources = SHCNRF_ShellLevel | SHCNRF_InterruptLevel |
SHCNRF_NewDelivery;
m_ulRegister = SHChangeNotifyRegister(hWnd, nSources, SHCNE_ALLEVENTS, uMsg,
ARRAYSIZE(entries), entries);
●ReadDirectoryChangesW系
//検出フラグを全部セット
//下記のコードはイベントが発生するまで返ってこないので、別スレッド内で待機させ
ています
//監視フォルダstrThreadPathをフルパス指定して呼び出す
HANDLE dwChangeHandles = CreateFile(strThreadPath, FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS |
FILE_FLAG_OVERLAPPED, NULL);
BOOL bRet = ReadDirectoryChangesW(dwChangeHandles, pbBuf0, 40960,
FALSE,
FILE_NOTIFY_CHANGE_ATTRIBUTES|
FILE_NOTIFY_CHANGE_SIZE|
FILE_NOTIFY_CHANGE_LAST_WRITE|
FILE_NOTIFY_CHANGE_SECURITY |
FILE_NOTIFY_CHANGE_CREATION |
FILE_NOTIFY_CHANGE_DIR_NAME|
FILE_NOTIFY_CHANGE_FILE_NAME,
&dwRetBytesDir, &m_ol, 0);
::WaitForSingleObject(m_ol.hEvent, INFINITE);
●FindFirstChangeNotification()は指定フラグが、ReadDirectoryChangesW()とほぼ同
じなので省略。
なんかとてつもなく遠回りな希ガス
svn status のほうが直接的だと思うが。
# Mercurial いいよ Subversion より簡単便利
tetrapodさんへ
ご意見ありがとうございます。
迂遠な事をしているのは自覚しています。
しかし、今回は残念ながらそういう無茶振りの命題なんです。
また高機能な他のバージョン管理システムでも使えりゃいいんですが、残念ながら既存
のTortoiseSVNを使う上での作業環境の改善というテーマなので、そこを覆すこともでき
ません。
書き漏らしていましたが、既に400近い管理ディレクトリが存在し、今後どんどん増えて
いくらしいので、エクスプローラとは違う見せ方のGUIを持ったツールが求められたとい
う経緯です。
たとえば、サブディレクトリ以下の「管理対象外」とか「ステータス不明」など指定さ
れたものをリアルタイムで列挙していくとか・・・のような使い方などが一例です。
(余談ですが、通常のファイルシステムで下位階層の*.txtを、リアルタイムで検出/一
覧表示のような動きをするものは既にあるものと考えてください)
エクスプローラの動作が気になるのもありますが、対象ディレクトリが多いのも定期走
査を採用できない原因の一つです。
あとsvn statusを使って出力内容を使用するとしても、定期的に走査する事になります
のでリアルタイム性がありません。
とりあえず監視ディレクトリの.svn以下のファイルの更新検出をトリガーにして、その
ディレクトリのオーバーレイアイコンの走査をすれば実現は可能なことは確認できまし
た。
が、もっと賢明な手法が無いかと悩んでおります。
例えば、自前でオーバーレイアイコンを書き換えた場合、
SHChangeNotify(SHCNE_ASSOCCHANGED , SHCNF_FLUSH, NULL, NULL);//関連付けアイコン
全部更新しろという意味
って通知を送ってやれば、エクスプローラには反映されますが、こういった通知を行っ
てないのにどうやって検出してるの?という事です。
VCから離れちゃいましたかね・・・
C言語というよりも、TortoiseSVNの仕様を調べるべきという内容になっちゃったので
クローズしておきます。
ありがとうございました。