请教如何监控目录?搜遍网络都找不到满意的。

DragonSchool 2007-06-17 12:14:20
不是没百度或GOO过,确实没找到满意的。

找到一个WATCHDIR的源码,却只能监控到目录的变动,但找不到变动的是什么文件;
还找到API-GUIDE里的一个例子,同样只能捕捉到目录改变的事件,但无法知道是什么文件改变了,及改变了什么;
找到介绍较多的是(Windows未公开函数揭密--之三),据说用了微软的三个未公开函数的源码,那个倒好,能监控到所有事件,但却只对WINDOW有效;
此源码的主要问题是只能捕捉到WINDOWS目录下的文件变动,其核心代码如下:
m_pidlDesktop = GetPIDLFromFolderID(0, CSIDL_DESKTOP)
If m_pidlDesktop Then

ps.pidl = m_pidlDesktop
ps.bWatchSubFolders = True

'注册Windows监视,将获得的句柄保存到m_hSHNotify中
m_hSHNotify = SHChangeNotifyRegister(hWnd, SHCNF_TYPE Or SHCNF_IDLIST, _
SHCNE_ALLEVENTS Or SHCNE_INTERRUPT, _
WM_SHNOTIFY, 1, ps)
SHNotify_Register = CBool(m_hSHNotify)

Else
Call CoTaskMemFree(m_pidlDesktop)
End If

重要的是: m_pidlDesktop = GetPIDLFromFolderID(0, CSIDL_DESKTOP)只能拿到桌面的PIDL,但一直找不到获得其它目录的PIDL的途径,如果能找到应该也能解决。

请大家帮下忙。
...全文
401 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jacktown 2007-06-27
  • 打赏
  • 举报
回复
qq:361925722 验证:VB编程
hongmosuyier 2007-06-27
  • 打赏
  • 举报
回复
理解的非常好了 !!!!
另外这只是做监控一方面
看来你想在监控上下功夫 给你个做监控图形的好网址: http://www.visual-graph.com
VBAdvisor 2007-06-19
  • 打赏
  • 举报
回复
Public Enum CSIDL
CSIDL_DESKTOP = &H0 ' <desktop>
CSIDL_INTERNET = &H1 ' Internet Explorer (icon on desktop)
CSIDL_PROGRAMS = &H2 ' Start Menu\Programs
CSIDL_CONTROLS = &H3 ' My Computer\Control Panel
CSIDL_PRINTERS = &H4 ' My Computer\Printers
CSIDL_PERSONAL = &H5 ' My Documents
CSIDL_FAVORITES = &H6 ' <user name>\Favorites
CSIDL_STARTUP = &H7 ' Start Menu\Programs\Startup
CSIDL_RECENT = &H8 ' <user name>\Recent
CSIDL_SENDTO = &H9 ' <user name>\SendTo
CSIDL_BITBUCKET = &HA ' <desktop>\Recycle Bin
CSIDL_STARTMENU = &HB ' <user name>\Start Menu
CSIDL_MYDOCUMENTS = &HC ' logical "My Documents" desktop icon
CSIDL_MYMUSIC = &HD ' "My Music" folder
CSIDL_MYVIDEO = &HE ' "My Videos" folder
CSIDL_DESKTOPDIRECTORY = &H10 ' <user name>\Desktop
CSIDL_DRIVES = &H11 ' My Computer
CSIDL_NETWORK = &H12 ' Network Neighborhood (My Network Places)
CSIDL_NETHOOD = &H13 ' <user name>\nethood
CSIDL_FONTS = &H14 ' windows\fonts
CSIDL_TEMPLATES = &H15
CSIDL_COMMON_STARTMENU = &H16 ' All Users\Start Menu
CSIDL_COMMON_PROGRAMS = &H17 ' All Users\Start Menu\Programs
CSIDL_COMMON_STARTUP = &H18 ' All Users\Startup
CSIDL_COMMON_DESKTOPDIRECTORY = &H19 ' All Users\Desktop
CSIDL_APPDATA = &H1A ' <user name>\Application Data
CSIDL_PRINTHOOD = &H1B ' <user name>\PrintHood
CSIDL_LOCAL_APPDATA = &H1C ' <user name>\Local Settings\Applicaiton Data (non roaming)
CSIDL_ALTSTARTUP = &H1D ' non localized startup
CSIDL_COMMON_ALTSTARTUP = &H1E ' non localized common startup
CSIDL_COMMON_FAVORITES = &H1F
CSIDL_INTERNET_CACHE = &H20
CSIDL_COOKIES = &H21
CSIDL_HISTORY = &H22
CSIDL_COMMON_APPDATA = &H23 ' All Users\Application Data
CSIDL_WINDOWS = &H24 ' GetWindowsDirectory()
CSIDL_SYSTEM = &H25 ' GetSystemDirectory()
CSIDL_PROGRAM_FILES = &H26 ' C:\Program Files
CSIDL_MYPICTURES = &H27 ' C:\Program Files\My Pictures
CSIDL_PROFILE = &H28 ' USERPROFILE
CSIDL_SYSTEMX86 = &H29 ' x86 system directory on RISC
CSIDL_PROGRAM_FILESX86 = &H2A ' x86 C:\Program Files on RISC
CSIDL_PROGRAM_FILES_COMMON = &H2B ' C:\Program Files\Common
CSIDL_PROGRAM_FILES_COMMONX86 = &H2C ' x86 Program Files\Common on RISC
CSIDL_COMMON_TEMPLATES = &H2D ' All Users\Templates
CSIDL_COMMON_DOCUMENTS = &H2E ' All Users\Documents
CSIDL_COMMON_ADMINTOOLS = &H2F ' All Users\Start Menu\Programs\Administrative Tools
CSIDL_ADMINTOOLS = &H30 ' <user name>\Start Menu\Programs\Administrative Tools
CSIDL_CONNECTIONS = &H31 ' Network and Dial-up Connections
CSIDL_COMMON_MUSIC = &H35 ' All Users\My Music
CSIDL_COMMON_PICTURES = &H36 ' All Users\My Pictures
CSIDL_COMMON_VIDEO = &H37 ' All Users\My Video
CSIDL_RESOURCES = &H38 ' Resource Direcotry
CSIDL_RESOURCES_LOCALIZED = &H39 ' Localized Resource Direcotry
CSIDL_COMMON_OEM_LINKS = &H3A ' Links to All Users OEM specific apps
CSIDL_CDBURN_AREA = &H3B ' USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning
CSIDL_COMPUTERSNEARME = &H3D ' Computers Near Me (computered from Workgroup membership)
End Enum

Public Enum CSIDL_FOLDERPATH
SHGFP_TYPE_CURRENT = &H0 ' Return the folder's current path.
SHGFP_TYPE_DEFAULT = &H1 ' Return the folder's default path.
End Enum

1.对于Special Folder,比较容易。直接用Call SHGetSpecialFolderLocation(0, CSIDL, lPIDL)。
2.对于一般Folder,用ILCreateFromPathW。

Private Declare Function ILCreateFromPathW Lib "shell32" (ByVal pwszPath As Long) As Long
#If WIN32_IE >= &H500 Then
Private Declare Sub ILFree Lib "shell32" (ByVal pidl As Long)
#Esle
Private Declare Sub ILFree Lib "shell32" Alias "#155" (ByVal pidl As Long)
#End If

Private Function PathToPIDL(ByVal sPath As String) As Long
Dim lRet As Long

lRet = ILCreateFromPath(StrPtr(sPath))
If lRet = 0 Then
sPath = StrConv(sPath, VBUnicode)
lRet = ILCreateFromPath(sPath)
End If

PathToPIDL = lRet
End Function

调用:
pidl = PathToPIDL(sPath)
。。。
ILFree pidl
pidl = 0

不知我理解对不对。敬请参考。
VBAdvisor 2007-06-19
  • 打赏
  • 举报
回复
’忘记了CSIDL:

Public Enum CSIDL
CSIDL_DESKTOP = &H0 ' <desktop>
CSIDL_INTERNET = &H1 ' Internet Explorer (icon on desktop)
CSIDL_PROGRAMS = &H2 ' Start Menu\Programs
CSIDL_CONTROLS = &H3 ' My Computer\Control Panel
CSIDL_PRINTERS = &H4 ' My Computer\Printers
CSIDL_PERSONAL = &H5 ' My Documents
CSIDL_FAVORITES = &H6 ' <user name>\Favorites
CSIDL_STARTUP = &H7 ' Start Menu\Programs\Startup
CSIDL_RECENT = &H8 ' <user name>\Recent
CSIDL_SENDTO = &H9 ' <user name>\SendTo
CSIDL_BITBUCKET = &HA ' <desktop>\Recycle Bin
CSIDL_STARTMENU = &HB ' <user name>\Start Menu
CSIDL_MYDOCUMENTS = &HC ' logical "My Documents" desktop icon
CSIDL_MYMUSIC = &HD ' "My Music" folder
CSIDL_MYVIDEO = &HE ' "My Videos" folder
CSIDL_DESKTOPDIRECTORY = &H10 ' <user name>\Desktop
CSIDL_DRIVES = &H11 ' My Computer
CSIDL_NETWORK = &H12 ' Network Neighborhood (My Network Places)
CSIDL_NETHOOD = &H13 ' <user name>\nethood
CSIDL_FONTS = &H14 ' windows\fonts
CSIDL_TEMPLATES = &H15
CSIDL_COMMON_STARTMENU = &H16 ' All Users\Start Menu
CSIDL_COMMON_PROGRAMS = &H17 ' All Users\Start Menu\Programs
CSIDL_COMMON_STARTUP = &H18 ' All Users\Startup
CSIDL_COMMON_DESKTOPDIRECTORY = &H19 ' All Users\Desktop
CSIDL_APPDATA = &H1A ' <user name>\Application Data
CSIDL_PRINTHOOD = &H1B ' <user name>\PrintHood
CSIDL_LOCAL_APPDATA = &H1C ' <user name>\Local Settings\Applicaiton Data (non roaming)
CSIDL_ALTSTARTUP = &H1D ' non localized startup
CSIDL_COMMON_ALTSTARTUP = &H1E ' non localized common startup
CSIDL_COMMON_FAVORITES = &H1F
CSIDL_INTERNET_CACHE = &H20
CSIDL_COOKIES = &H21
CSIDL_HISTORY = &H22
CSIDL_COMMON_APPDATA = &H23 ' All Users\Application Data
CSIDL_WINDOWS = &H24 ' GetWindowsDirectory()
CSIDL_SYSTEM = &H25 ' GetSystemDirectory()
CSIDL_PROGRAM_FILES = &H26 ' C:\Program Files
CSIDL_MYPICTURES = &H27 ' C:\Program Files\My Pictures
CSIDL_PROFILE = &H28 ' USERPROFILE
CSIDL_SYSTEMX86 = &H29 ' x86 system directory on RISC
CSIDL_PROGRAM_FILESX86 = &H2A ' x86 C:\Program Files on RISC
CSIDL_PROGRAM_FILES_COMMON = &H2B ' C:\Program Files\Common
CSIDL_PROGRAM_FILES_COMMONX86 = &H2C ' x86 Program Files\Common on RISC
CSIDL_COMMON_TEMPLATES = &H2D ' All Users\Templates
CSIDL_COMMON_DOCUMENTS = &H2E ' All Users\Documents
CSIDL_COMMON_ADMINTOOLS = &H2F ' All Users\Start Menu\Programs\Administrative Tools
CSIDL_ADMINTOOLS = &H30 ' <user name>\Start Menu\Programs\Administrative Tools
CSIDL_CONNECTIONS = &H31 ' Network and Dial-up Connections
CSIDL_COMMON_MUSIC = &H35 ' All Users\My Music
CSIDL_COMMON_PICTURES = &H36 ' All Users\My Pictures
CSIDL_COMMON_VIDEO = &H37 ' All Users\My Video
CSIDL_RESOURCES = &H38 ' Resource Direcotry
CSIDL_RESOURCES_LOCALIZED = &H39 ' Localized Resource Direcotry
CSIDL_COMMON_OEM_LINKS = &H3A ' Links to All Users OEM specific apps
CSIDL_CDBURN_AREA = &H3B ' USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning
CSIDL_COMPUTERSNEARME = &H3D ' Computers Near Me (computered from Workgroup membership)
End Enum

Public Enum CSIDL_FOLDERPATH
SHGFP_TYPE_CURRENT = &H0 ' Return the folder's current path.
SHGFP_TYPE_DEFAULT = &H1 ' Return the folder's default path.
End Enum
VBAdvisor 2007-06-19
  • 打赏
  • 举报
回复
1.对于Special Folder,比较容易。直接用Call SHGetSpecialFolderLocation(0, CSIDL, lPIDL)。
2.对于一般Folder,用ILCreateFromPathW。

Private Declare Function ILCreateFromPathW Lib "shell32" (ByVal pwszPath As Long) As Long
#If WIN32_IE >= &H500 Then
Private Declare Sub ILFree Lib "shell32" (ByVal pidl As Long)
#Esle
Private Declare Sub ILFree Lib "shell32" Alias "#155" (ByVal pidl As Long)
#End If

Private Function PathToPIDL(ByVal sPath As String) As Long
Dim lRet As Long

lRet = ILCreateFromPath(StrPtr(sPath))
If lRet = 0 Then
sPath = StrConv(sPath, VBUnicode)
lRet = ILCreateFromPath(sPath)
End If

PathToPIDL = lRet
End Function

调用:
pidl = PathToPIDL(sPath)
。。。
ILFree pidl
pidl = 0

不知我理解对不对。敬请参考。

lsftest 2007-06-19
  • 打赏
  • 举报
回复
试试监视wmi的_instanceoperationevent类
DragonSchool 2007-06-17
  • 打赏
  • 举报
回复
那代码帮不了我,有没有人写过一个根据目录名称返回PIDL的函数?
VBAdvisor 2007-06-17
  • 打赏
  • 举报
回复
http://www.pudn.com/downloads53/sourcecode/windows/shell/detail183373.html
文件名称: SHChangeNotifications
DragonSchool 2007-06-17
  • 打赏
  • 举报
回复
To zzyong00(阿勇):
你那几个函数很多代码都有,但是它只能知道目录改变了,而不能知道受影响的文件是什么?

To VBAdvisor(Sunlight):
目录监控的代码已成功,但是暂时不能得到其它目录的PIDL,所以不能用代码来指定要监控的目录,而使用弹出目录框选择目录的方式就能得到PIDL。
现在是求获得PIDL的代码了。
VBAdvisor 2007-06-17
  • 打赏
  • 举报
回复
你可以搜:
google "VB Folder Watch" or "VB Folder Monitor" or "VB Dir Guard"
VBAdvisor 2007-06-17
  • 打赏
  • 举报
回复
VB做目录/文件监控,很难。要对Windows文件系统,消息系统,对Shell Notifications APIs很熟悉。
http://members.aol.com/btmtz/vb
http://www.mvps.org/ccrp
zzyong00 2007-06-17
  • 打赏
  • 举报
回复
Private Declare Function FindFirstChangeNotification Lib "kernel32.dll" Alias "FindFirstChangeNotificationA" (ByVal lpPathName As String, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long
Private Declare Function FindCloseChangeNotification Lib "kernel32.dll" (ByVal hChangeHandle As Long) As Long
Private Declare Function FindNextChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
研究这几个API吧

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧