网络共享上的Powershell System.IO.FileSystemWatcher在远程写入文件时不起作用

时间:2013-12-05 01:31:44

标签: powershell filesystemwatcher

我需要查看何时将文件写入目录。此目录位于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开发的新手。

2 个答案:

答案 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