วันจันทร์ที่ 4 สิงหาคม พ.ศ. 2557

เขียน VB.NET ให้ Monitor File ใน Folder

       ในการเขียนให้ VB.NET ทำการ Monitor การเปลี่ยนแปลงของ File ใน Folder ที่เรากำหนดไว้  เริ่มแรกเราจะต้องทำการ Import Class System.Diagnostics เข้ามาใน Project ของเราก่อน

Imports System.Diagnostics

ตากนั้นเราก็ประกาศตัวแปรขึ้นมา Type เป็น FileSystemWatcher ไว้ที่ด้านบนสุดของ Class เพื่อที่ทุก Function ใน Class สามารถที่จะเรียกใช้ได้  

Dim watchFolder As FileSystemWatcher

และเมื่อต้องการที่จะใช้งาน เช่น กดปุ่มเพื่อให้เริ่ม Monitor ก็จะเรียกใช้ดังนี้

Private Sub cmdCompare_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCompare.Click
      watchFolder = New FileSystemWatcher
      watchFolder.SynchronizingObject = Me
      watchFolder.Path=[Path Folder ที่ต้องการ Monitor]
'กำหนดประเภทของ Monitor Folder
      watchFolder.NotifyFilter = NotifyFilters.DirectoryName
      watchFolder.NotifyFilter = watchFolder.NotifyFilter Or NotifyFilters.FileName
      watchFolder.NotifyFilter = watchFolder.NotifyFilter Or NotifyFilters.Attributes
'เพิ่ม Events ของการ Monitor ว่าหากเกิดการเปลี่ยนแปลงที่กำหนดไว้แล้วจะให้ทำอะไร
'กรณีที่เกิดการเปลี่ยนแปลง File
      AddHandler watchFolder.Changed, AddressOf [ชื่อ Function ที่จะให้ไปทำ]
'กรณีที่เกิดการ create File ใหม่
      AddHandler watchFolder.Created, AddressOf [ชื่อ Function ที่จะให้ไปทำ]
'กรณีที่เกิดการลบ File ทิ้ง
      AddHandler watchFolder.Deleted, AddressOf [ชื่อ Function ที่จะให้ไปทำ]
'เริ่มการ Monitor Folder เพื่อจับการเปลี่ยนแปลงของ File ต่างๆ
      watchFolder.EnableRaisingEvents = True
End Sub

หากเราต้องการที่จะหยุดการ Monitor ก็แค่สั่งให้ EnableRaisingEvents = false เท่านั้นเองครับ

ส่วนใน Funtion ที่เราจะให้มันทำงานเมื่อมีการเปลี่ยนแปลงนั้นก็มีการเพิ่มการรับค่าอีกนิดหน่อย  โดยตอนที่ประกาศ Function นั้นต้องมีการรับ Parameter e มาเป็น System.IO.FileSystemEventArgs ด้วย เช่น

Private Sub reCheckFile(ByVal source As Object, ByVal e As System.IO.FileSystemEventArgs)
       
End Sub

ส่วนในการตรวจเช็คค่าที่เกิดขึ้นนั้น จะใช้เป็น e.ChangeType เพื่อเป็นตัวบอกว่า File ที่มีการเปลี่ยนแปลงนั้นเป็นประเภทได้ เช่น Created, Changed, Deleted, Renamed เช่น

Select case e.ChangeType
       case WatcherChangeTypes.Created
              'Do Something
       case WatcherChangeTypes.Changed
              'Do Something
end Select

      นอกจากนั้น  หากเราต้องการที่จะทราบว่า File อะไรที่มีการเปลี่ยนแปลงก็ใช้ e.name หรือใช้ e.FullPath เพื่อแสดง Path เต็มของ File ที่มีการเปลี่ยนแปลง

แต่จากการใช้งานจะพบปัญหาอยู่ 2 อย่างคือ
  1. ในกรณีที่ File มีการ Change นั้นจะมีการ Raise Event ออกมา 2 ครั้ง
  2. เราจะไม่สามารถเรียกใช้ Function อื่นได้  เนื่องจากเป็นการ Run อยู่บนละ Process และ .NET นั้นไม่ยอมให้มีการเรียกใช้ Function กันข้าม Process ได้
แต่ก็มีวิธีการแก้ไขอยู่ทั้ง 2 วิธีคือ
  1. ปัญหาแรกนั้น ก็อาจจะประกาศตัวแปรที่เป็น Boolean เพื่อเช็คว่ามีการทำไปแล้วหรือยังก็ได้
  2. ปัญหาที่ 2 นั้นให้เรียก Function อื่นผ่าน Method Invoke ของโปรแกรม  เช่น
    Me.Invoke(New MethodInvoker(Function() [ชื่อ Function](Parameter) ) )

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

fanslave3

get-fans-468x60-2