سؤال

وأنا أعمل على خدمة ويندوز أن ساعات قليلة المجلدات لإجراء تغييرات، إبداعات، والحذف. كل شيء يعمل بشكل جيد باستثناء مراقب واحد أن الساعات ملف واحد (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

وتفريغ إعلام تصفية كل ذلك معا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top