如何在F#中使用FileSystemWatcher

时间:2015-03-08 09:26:03

标签: f#

我想查看文件更改目录(创建,编辑,重命名,删除),并在检测到更改时执行某些操作,例如调用函数。据我所知,FileSystemWatcher应该这样做。但是,文档页面上没有F#的示例代码,并且Web上的其他地方似乎也很少。

根据我的发现,以下至少是答案的一部分:

let fileSystemWatcher = new FileSystemWatcher()

fileSystemWatcher.Path <- @"C:\temp" // I'm actually using a variable here
fileSystemWatcher.NotifyFilter <- NotifyFilters.LastWrite
fileSystemWatcher.EnableRaisingEvents <- true
fileSystemWatcher.IncludeSubdirectories <- true

fileSystemWatcher.Changed.Add(fun _ -> printfn "changed")
fileSystemWatcher.Created.Add(fun _ -> printfn "created")
fileSystemWatcher.Deleted.Add(fun _ -> printfn "deleted")
fileSystemWatcher.Renamed.Add(fun _ -> printfn "renamed")
然而,

实际上并没有任何事情。 Some posts似乎有一个Async循环来响应事件,但是如果我使用那里的代码片段F#告诉我Async.AwaitObservable未定义。

如果有人能够提供FileSystemWatcher正确用法的完整示例,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

在FSI工作正常。

删除NotifyFilter位 - 您将覆盖默认设置(无论如何都包含LastWrite),并且不会引发您关注的某些事件。 NotifyFilter是一个过时的枚举标志样式字段,因此您可以像这样添加新值:

watcher.NotifyFilter <- watcher.NotifyFilter ||| NotifyFilters.LastWrite

您本身并不需要异步循环 - 在您链接到它的示例中,只是替换您已经使用的标准事件处理程序。但是如果你想使用Async.AwaitObservable,请在nuget上查找FSharpx。