TortoiesSVNによるオーバーレイアイコンの変更を検出したい – プログラミング – Home

TortoiesSVNによるオーバーレ...
 
通知
すべてクリア

[解決済] TortoiesSVNによるオーバーレイアイコンの変更を検出したい


AR2
 AR2
(@ar2)
Estimable Member
結合: 5年前
投稿: 110
Topic starter  

 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()とほぼ同
じなので省略。


引用
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

なんかとてつもなく遠回りな希ガス
svn status のほうが直接的だと思うが。

# Mercurial いいよ Subversion より簡単便利


返信引用
AR2
 AR2
(@ar2)
Estimable Member
結合: 5年前
投稿: 110
Topic starter  

tetrapodさんへ
ご意見ありがとうございます。

迂遠な事をしているのは自覚しています。
しかし、今回は残念ながらそういう無茶振りの命題なんです。
また高機能な他のバージョン管理システムでも使えりゃいいんですが、残念ながら既存
のTortoiseSVNを使う上での作業環境の改善というテーマなので、そこを覆すこともでき
ません。

書き漏らしていましたが、既に400近い管理ディレクトリが存在し、今後どんどん増えて
いくらしいので、エクスプローラとは違う見せ方のGUIを持ったツールが求められたとい
う経緯です。
たとえば、サブディレクトリ以下の「管理対象外」とか「ステータス不明」など指定さ
れたものをリアルタイムで列挙していくとか・・・のような使い方などが一例です。
(余談ですが、通常のファイルシステムで下位階層の*.txtを、リアルタイムで検出/一
覧表示のような動きをするものは既にあるものと考えてください)

エクスプローラの動作が気になるのもありますが、対象ディレクトリが多いのも定期走
査を採用できない原因の一つです。
あとsvn statusを使って出力内容を使用するとしても、定期的に走査する事になります
のでリアルタイム性がありません。

とりあえず監視ディレクトリの.svn以下のファイルの更新検出をトリガーにして、その
ディレクトリのオーバーレイアイコンの走査をすれば実現は可能なことは確認できまし
た。
が、もっと賢明な手法が無いかと悩んでおります。
例えば、自前でオーバーレイアイコンを書き換えた場合、
SHChangeNotify(SHCNE_ASSOCCHANGED , SHCNF_FLUSH, NULL, NULL);//関連付けアイコン
全部更新しろという意味
って通知を送ってやれば、エクスプローラには反映されますが、こういった通知を行っ
てないのにどうやって検出してるの?という事です。

VCから離れちゃいましたかね・・・


返信引用
AR2
 AR2
(@ar2)
Estimable Member
結合: 5年前
投稿: 110
Topic starter  

 C言語というよりも、TortoiseSVNの仕様を調べるべきという内容になっちゃったので
クローズしておきます。
 ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました