如何在 F# 中使用 FileSystemWatcher
How to use FileSystemWatcher in F#
我想监视目录中的文件更改(创建、编辑、重命名、删除)并在检测到更改时执行一些操作,例如调用函数。据我所知,FileSystemWatcher 应该这样做。但是,文档页面上没有 F# 的示例代码,网络上的其他地方似乎也很少。
根据我的发现,以下至少是部分答案:
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 似乎有一个异步循环来对事件做出反应,但如果我使用那里的代码片段,F# 会告诉我 Async.AwaitObservable
未定义。
如果有人能提供 FileSystemWatcher 正确用法的完整示例,我将不胜感激。
我在 FSI 中工作得很好。
删除 NotifyFilter
位 - 您将覆盖默认设置(无论如何都包括 LastWrite
),并且不会引发您关心的一些事件。 NotifyFilter
是一个过时的枚举标志样式字段,因此您可以像这样在其中添加一个新值:
watcher.NotifyFilter <- watcher.NotifyFilter ||| NotifyFilters.LastWrite
您本身不需要异步循环 - 在您链接到它的示例中,它只是替换了您已经在使用的标准事件处理程序。但是如果你想使用 Async.AwaitObservable
,请在 nuget 上查找 FSharpx。
我想监视目录中的文件更改(创建、编辑、重命名、删除)并在检测到更改时执行一些操作,例如调用函数。据我所知,FileSystemWatcher 应该这样做。但是,文档页面上没有 F# 的示例代码,网络上的其他地方似乎也很少。
根据我的发现,以下至少是部分答案:
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 似乎有一个异步循环来对事件做出反应,但如果我使用那里的代码片段,F# 会告诉我 Async.AwaitObservable
未定义。
如果有人能提供 FileSystemWatcher 正确用法的完整示例,我将不胜感激。
我在 FSI 中工作得很好。
删除 NotifyFilter
位 - 您将覆盖默认设置(无论如何都包括 LastWrite
),并且不会引发您关心的一些事件。 NotifyFilter
是一个过时的枚举标志样式字段,因此您可以像这样在其中添加一个新值:
watcher.NotifyFilter <- watcher.NotifyFilter ||| NotifyFilters.LastWrite
您本身不需要异步循环 - 在您链接到它的示例中,它只是替换了您已经在使用的标准事件处理程序。但是如果你想使用 Async.AwaitObservable
,请在 nuget 上查找 FSharpx。