如何被动知道一个文件是否被创建 而不是主动扫描
比如文件 1.txt 本来没有 被其他创建了后 有什么办法能通知脚本 让程序知道这文件被创建了一般的的解决方法是用循环 不停的扫描目录 以发现1.txt存在 存在即被创建了
但这样需要脚本不停的用循环执行FileExists 如果长时间运行 会很耗cpu
请问高人有解决之道吗
[ 本帖最后由 bluefog 于 2008-7-25 11:29 编辑 ] 试下这个,忘记原作者了。
$strComputer = "."
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\cimv2")
$colMonitoredEvents = $objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE " _
& "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
& "TargetInstance.GroupComponent= " _
& "'Win32_Directory.Name=""d:\\\\WINDOWS""'")
While 1
$objEventObject = $colMonitoredEvents.NextEvent()
Select
Case $objEventObject.Path_.Class()="__InstanceCreationEvent"
ConsoleWrite ("一个新的文件被创建: " & $objEventObject.TargetInstance.PartComponent() & @CR)
Case $objEventObject.Path_.Class()="__InstanceDeletionEvent"
ConsoleWrite ("一个旧的文件被删除: " & $objEventObject.TargetInstance.PartComponent() & @CR)
EndSelect
WEnd 似乎还是个循环,只是这个方法很巧妙的。 谢谢bing614
研究一下 另外请问楼上2位高人 我这段代码怎么执行没有结果啊my.ini是肯定存在的
但程序运行什么都没有反馈
Func fxwj()
If FileExists("d:\my.ini") Then
MsgBox(4096, "my.ini", "存在")
EndIf
EndFunc
AdlibEnable("fxwj",30000)
非常感谢
[ 本帖最后由 bluefog 于 2008-7-22 14:09 编辑 ] ("d:my.ini") ===("d:\my.ini") 原程序是对的 考过来编辑时候出了点错
AdlibEnable("fxwj",30000) 没有任何结果
而单独用 fxwj() 就有结果 2楼的代码实在看不懂 不知道该如何改
汗一个 $zd=0
While $zd=0
;AdlibEnable("fxwj",3000)
If FileExists("d:\my.ini") Then
$zd=1
Else
$zd=0
EndIf
Sleep(1000)
WEnd
用这个办法解决了 cpu占用在0-3之间 还是可以接受的
再次感谢楼上二位 你的代码缺少等待,运行了就结束了,所以要给予一定的等待时间才行。
HotKeySet("{Esc}","_EXit")
AdlibEnable("fxwj", 5000)
Func fxwj()
If FileExists("d:\my.ini") Then
MsgBox(4096, "my.ini", "存在")
EndIf
EndFunc ;==>fxwj
Func _exit()
Exit
EndFunc
While 1
sleep(100)
WEnd 谢谢顽固不化 找到了关键所在 调试通过 $strComputer = "."
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\cimv2")
$colMonitoredEvents = $objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE " _
& "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
& "TargetInstance.GroupComponent= " _
& "'Win32_Directory.Name=""C:\\\\Documents and Settings\\\\Administrator\\\\桌面""'")
While 1
$objEventObject = $colMonitoredEvents.NextEvent()
Select
Case $objEventObject.Path_.Class()="__InstanceCreationEvent"
Automsg("新建文件:" & $objEventObject.TargetInstance.PartComponent() & @CR)
Case $objEventObject.Path_.Class()="__InstanceDeletionEvent"
Automsg("删除文件:" & $objEventObject.TargetInstance.PartComponent() & @CR)
EndSelect
WEnd
Func Automsg($Automsg)
$Automsg2 = StringLeft($Automsg, 5)
$Automsg = StringTrimLeft($Automsg, StringInStr($Automsg, "="))
if StringLeft($Automsg, 1) = '"' then $Automsg = StringTrimLeft($Automsg, 1)
do
$Automsg = StringTrimRight($Automsg, 1)
Until StringRight($Automsg, 1) = '"'
$Automsg = StringTrimRight($Automsg, 1)
msgbox(0,"目录监视事件",$Automsg2 & "" & $Automsg)
EndFunc
这样就好理解了
页:
[1]