1

いくつかのフォルダーの変更、作成、および削除を監視するWindowsサービスに取り組んでいます。小さな変更がないか単一のファイル(構成設定を含むXMLファイル)を監視する1人のウォッチャーを除いて、すべてうまく機能します。

Windowsサービスコードを取得して、ファイルシステムウォッチャー用の開始/停止ボタンを備えた単純なWindowsアプリケーションに入れて、ステップスルーしてみました。XML構成ファイルのファイル変更を検出することはありません。変更は実際に行われており、ファイルの「変更日」が更新されています。

XmlEventReferences = New System.IO.FileSystemWatcher()
XmlEventReferences.Path = "C:\XmlReferences\"
XmlEventReferences.Filter = "*.xml"
XmlEventReferences.NotifyFilter = IO.NotifyFilters.FileName
AddHandler XmlEventReferences.Changed, AddressOf ReloadEventReferences
AddHandler XmlEventReferences.Created, AddressOf ReloadEventReferences
AddHandler XmlEventReferences., AddressOf ReloadEventReferences
XmlEventReferences.EnableRaisingEvents = True

これはコードの一部であり、これはXMLファイルのサンプルです。

<EventReference>
    <ER_EL_NUMBER>1</ER_EL_NUMBER>
    <ER_SEND_TO_DATABASE>true</ER_SEND_TO_DATABASE>
    <ER_ACTIVATE_ALARM>true</ER_ACTIVATE_ALARM>
    <ER_DESCRIPTION />
</EventReference>
4

3 に答える 3

11

問題はの値だと思いますNotifyFilter。実際にはFileSystemWatcher、ファイル名の変更を探すように指示しただけです。Changedファイル変更のイベントも発生させるには、LastWriteフラグも指定する必要があります。

つまり、適切なコード行を次のように変更する必要があります。

XmlEventReferences.NotifyFilter = IO.NotifyFilters.FileName |
    IO.NotifyFilters.LastWrite;

詳細については、NotifyFiltersMSDNのページを参照してください。

注:Joshua Beldenが指摘しているように、 MSDNが述べているように、「デフォルトはLastWrite、FileName、およびDirectoryNameのビットごとのORの組み合わせです」NotifyFilterため、プロパティを設定する必要はまったくありません。ただし、そのような場合は明示することが常に最善であると私は主張します。そうすれば、何が監視されているのか、何が監視されていないのかが完全に明らかになりますFileSystemWatcher

于 2009-04-29T15:30:13.047 に答える
1

あなたは私が信じる変化を拾う.NotifyFilterようなものにあなたを変える必要があります。LastWrite

こちらのMSDNリンク

于 2009-04-29T15:29:32.673 に答える
0

このコードは私にとってはうまくいくように見え、test.xml ファイルへの編集を拾いました。は

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim XmlEventReferences = New System.IO.FileSystemWatcher()
    XmlEventReferences.Path = "C:\"
    XmlEventReferences.Filter = "*.xml"
    XmlEventReferences.EnableRaisingEvents = True
    AddHandler XmlEventReferences.Changed, AddressOf Watch
End Sub

Private Sub Watch(ByVal sender As Object, ByVal e As FileSystemEventArgs)
    Dim s As String = e.FullPath
End Sub

通知フィルターをまとめてダンプします。

于 2009-04-29T15:35:42.690 に答える