bluefog 发表于 2008-7-22 13:03:21

如何被动知道一个文件是否被创建 而不是主动扫描

比如文件 1.txt 本来没有 被其他创建了后 有什么办法能通知脚本 让程序知道这文件被创建了

一般的的解决方法是用循环 不停的扫描目录 以发现1.txt存在 存在即被创建了

但这样需要脚本不停的用循环执行FileExists 如果长时间运行 会很耗cpu

请问高人有解决之道吗

[ 本帖最后由 bluefog 于 2008-7-25 11:29 编辑 ]

bing614 发表于 2008-7-22 13:32:10

试下这个,忘记原作者了。
$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

顽固不化 发表于 2008-7-22 13:36:18

似乎还是个循环,只是这个方法很巧妙的。

bluefog 发表于 2008-7-22 13:41:41

谢谢bing614
研究一下

bluefog 发表于 2008-7-22 13:45:06

另外请问楼上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 编辑 ]

顽固不化 发表于 2008-7-22 13:53:21

("d:my.ini") ===("d:\my.ini")

bluefog 发表于 2008-7-22 14:01:35

原程序是对的 考过来编辑时候出了点错

AdlibEnable("fxwj",30000) 没有任何结果

而单独用 fxwj() 就有结果

bluefog 发表于 2008-7-22 14:30:12

2楼的代码实在看不懂 不知道该如何改
汗一个

bluefog 发表于 2008-7-22 15:13:02

$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之间 还是可以接受的
再次感谢楼上二位

顽固不化 发表于 2008-7-22 15:23:55

你的代码缺少等待,运行了就结束了,所以要给予一定的等待时间才行。
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

bluefog 发表于 2008-7-22 15:32:29

谢谢顽固不化 找到了关键所在 调试通过

xsjtxy 发表于 2010-3-18 10:48:08

$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]
查看完整版本: 如何被动知道一个文件是否被创建 而不是主动扫描