FileSystemWatcher حدث تم تغييره لا تثار
-
03-07-2019 - |
سؤال
وأنا أعمل على خدمة ويندوز أن ساعات قليلة المجلدات لإجراء تغييرات، إبداعات، والحذف. كل شيء يعمل بشكل جيد باستثناء مراقب واحد أن الساعات ملف واحد (XML الملف مع إعدادات التكوين) لإجراء تغييرات طفيفة.
وحاولت أخذ رمز خدمة ويندوز وضعه في برنامج ويندوز بسيط مع بدء / إيقاف الأزرار لمراقبي الملفات وخرج من ذلك. أنه لم يكشف تغيير ملف من ملف التكوين 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>
المحلول
وأعتقد أن المشكلة تكمن في قيمة NotifyFilter
. لقد فعلا قال فقط FileSystemWatcher
للبحث عن التغييرات اسم الملف. لحملها على رفع الحدث Changed
عن التعديلات الملف جدا، فأنت تريد أن تحديد العلامة LastWrite
كذلك.
وأي بمعنى. يجب تغيير خط appropiate من التعليمات البرمجية إلى:
XmlEventReferences.NotifyFilter = IO.NotifyFilters.FileName |
IO.NotifyFilters.LastWrite;
NotifyFilters
الصفحة على MSDN لأكثر معلومات.
ملحوظة: كما يشير جوشوا بيلدن بها، حتى أنك لا تحتاج إلى تعيين الخاصية NotifyFilter
على الإطلاق لأنه كما <لأ href = "http://msdn.microsoft.com/en-us/library/system.io .filesystemwatcher.notifyfilter.aspx "يختلط =" noreferrer "> الدول MSDN :" الافتراضي هو أحادي المعامل OR مزيج من LastWrite، اسم الملف، وDirectoryName ". ومع ذلك، أود أن أقول أنه من الأفضل دائما أن تكون واضحة في مثل هذه الحالات - في ذلك الوقت يجعل من الواضح تماما لما هو FileSystemWatcher
وهو لا م> مشاهدة
نصائح أخرى
وتحتاج إلى تغيير .NotifyFilter
لشيء من هذا القبيل LastWrite
لالتقاط التغيرات أعتقد.
وصلة MSDN هنا
وهذا الرمز يبدو أن العمل بالنسبة لي، والتقطت لتحرير إلى ملف 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
وتفريغ إعلام تصفية كل ذلك معا.