我需要查看何时将文件写入目录。此目录位于Windows 2003服务器上的映射网络驱动器上。如果我将文件复制到服务器上的此目录,它可以工作。如果我远程写文件,它不起作用。当远程写入文件时,我该怎么做才能使它工作?我想将此作为事件通知保留,但如果需要,将更改为轮询方法。如果这是正确的方法,我需要一些最佳实践建议。我可以了解Windows文件写入通知如何工作的任何细节。
示例代码:
$watchFolder = "Z:\watched";
$filter = "*.data";
$watcher = New-Object System.IO.FileSystemWatcher $watchFolder, $filter
$watcher.EnableRaisingEvents = $true
$created = Register-ObjectEvent $watcher Created -Action {
write-host "Found: $($eventArgs.FullPath)"
}
我的经验等级:咸的unix管理员,Windows开发的新手。
答案 0 :(得分:2)
在FileSystemWatcher中有两个"过滤器"类型的规范,"过滤器"字符串和" NotifyFilter"参数。您在行
中传递给ctor的$ filter参数$watcher = New-Object System.IO.FileSystemWatcher $watchFolder, $filter
仅设置"过滤器" string,它只确定一个" name"过滤器为观察者。您还需要设置NotifyFilter参数以指定要监视的更改类型。这可以在同一行上完成:
$watcher = New-Object System.IO.FileSystemWatcher $watchFolder,$filter -Property @{IncludeSubdirectories = $false; InternalBufferSize = 16384; EnableRaisingEvents = $true; NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
我还放了一些你应该设置的其他属性。 " InternalBufferSize"是一个修复错误的黑客 - 我无法记住错误的细节,但最好把它放进去(google了解详情。)
我是,顺便说一下,即使有这些修正,你也有类似的问题:在网络驱动器上观察文件(无论你是否已经映射并使用该映射进行访问)都是不稳定的。此外,如果您正在观看的目录在监视期间消失(并且可能会重新出现),则filesystemwatcher中存在已知错误 - 除非已指定超时,否则filesystemwatcher将无法恢复。
所以,也许我的修改会解决你的问题,也许不会。如果您发现问题的解决方案与我在此处发布的不同,您是否介意发布,因为即使我发布的内容也不足以解决我的问题,这听起来与您的问题类似。感谢。
答案 1 :(得分:0)
从c#sample here http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher%28v=vs.110%29.aspx可以看出,您需要完全信任代码并设置NotifyFilter = [System.IONotifyFilters] :: DirectoryName