「ごみ箱」の変更を監視するには?

解決


kun  2003-03-14 16:32:00  No: 51196  IP: [192.*.*.*]

FindFirstChangeNotification()関連のAPIを使用すればファイルやディレクトリの変更を
監視できますが、Windowsの「ごみ箱」の監視をしたい場合はどのようにすれば良いので
しょうか。
FindFirstChangeNotification()はパスを渡してやる必要があるのですが、「ごみ箱」の
パスを取得できないため悩んでいます。

編集 削除
DotL  2003-03-14 21:12:54  No: 51197  IP: [192.*.*.*]

たとえば、

LPTSTR getPath[255];
SHGetSpecialFolderPath(NULL,getPath,CSIDL_BITBUCKET,false);

でgetPathにパス名が入ります。

編集 削除
DotL  2003-03-14 21:14:59  No: 51198  IP: [192.*.*.*]

[訂正]

TCHAR getPath[255];
SHGetSpecialFolderPath(NULL,getPath,CSIDL_BITBUCKET,false);

編集 削除
kun  2003-03-15 00:29:45  No: 51199  IP: [192.*.*.*]

DotLさん。レスありがとうございます。

> TCHAR getPath[255];
> SHGetSpecialFolderPath(NULL,getPath,CSIDL_BITBUCKET,false);

お教え頂いた上記の関数を組み込んでみたのですが、getPath[0]にNULLが設定されてし
まいます。ただSHGetSpecialFolderPath()自体はSUCCEEDED()マクロでチェックした結果
成功しているようでした。

またSHGetSpecialFolderPath()はIE4.0以降相当がインストールされていないとダメみたいな
情報を見かけたので、良く似たSHGetSpecialFolderLocation()も試してみました。

  TCHAR getPath[255];
  LPITEMIDLIST lpIDL;
  if (SUCCEEDED(::SHGetSpecialFolderLocation(NULL, CSIDL_BITBUCKET, &lpIDL))) {
      ::SHGetPathFromIDList(lpIDL, getPath);
      ::CoTaskMemFree(lpIDL);
  }

これも関数は成功しているのですがgetPath[0]=NULLの結果が返ってきました。
ちなみに「CSIDL_BITBUCKET」を「CSIDL_DESKTOP」に変更した場合は、どちらの関数も
getPathにデスクトップのパスを返してきます。
もしかしたら「ごみ箱」にはパスが無いのでしょうか。

テスト環境はWin98, Win98SE, WinXPで試しました。
開発環境は VC6.0 + SP5 です。(書き忘れていました)

編集 削除
YuO  2003-03-15 01:16:25  No: 51200  IP: [192.*.*.*]

CSIDL_BITBUCKETは仮想フォルダであって,ファイルシステムディレクトリではないです。
http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp
なので,パス名を取得しようとしても,無理な話です。

また,FATでは\Recycledですが,NTFSでは\Recyclerの下にSIDを含む名前になります。
というわけで,全てのドライブの該当ディレクトリを全て監視するというのが,
手抜きですが簡単な解決方法かと思います。

編集 削除
kun  2003-03-15 02:36:45  No: 51201  IP: [192.*.*.*]

> また,FATでは\Recycledですが,NTFSでは\Recyclerの下にSIDを含む名前になります。
> というわけで,全てのドライブの該当ディレクトリを全て監視するというのが,
> 手抜きですが簡単な解決方法かと思います。

YuOさんに示して頂いた上記の方法でごみ箱の監視を行う事にしました。
ただ少し欲を言えば、"C:\RECYCLED"といったごみ箱のパスをOSが返してくれると
嬉しかったですね。

DotLさん、YuOさん。
付き合って頂きアリガトウございました。

編集 削除