我有一個監控根文件夾下有多個文件夾和每個文件夾包含多個文件(.csv)的需求這些文件正在從服務器複製到工作站一些其他第三方工具。我必須監視工作站根目錄的文件夾,並且當在任何子文件夾中創建或更新.csv文件時,我必須將.csv文件數據(更新或新建)寫入sql服務器數據庫。在將數據寫入sql server時,我需要捕獲更新/創建.csv文件的子文件夾名稱。這樣我可以在一個數據庫文件中分開文件夾的數據。VB.Net FileSystemWatcher - 多個文件夾和多個文件
在工作站pc上運行程序時,應用程序崩潰而沒有任何特定的錯誤消息。由於該應用程序在遠程PC上運行,因此我無法調試應用程序以檢查哪條線路導致崩潰。下面是代碼:
Public Class FolderWatchAndProcess
Dim blnMonitorUpdated As Boolean = True
Dim blnMonitorCreated As Boolean = True
Dim blnShowMessage As Boolean
Dim strFullFileName As String
Dim strFileName As String
Dim strFolderName As String
Private Delegate Sub updateLabel(ByVal newLabel As String)
Private Sub updateLabelHandler(ByVal labelText As String)
lblMetNo.Text = labelText
End Sub
Private Sub ReadAndInsertCSVData()
' This routine checks for duplicates and inserts new records into the sql server database
End Sub
Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'lblMonitorPath.Text = "C:\RootFolder\"
'btnStartWatching_Click(Nothing, Nothing)
'Me.WindowState = FormWindowState.Minimized
End Sub
Private Sub btnStartWatching_Click(sender As Object, e As EventArgs) Handles btnStartWatching.Click
btnStartWatching.Text = "Stop Watching"
Dim aFileWatcherInstance As ArrayList = New ArrayList
For Each sMonitorFolder As String In lstFolders.Items
If IO.Directory.Exists(sMonitorFolder) Then
Dim oFileWatcher As FileSystemWatcher = New FileSystemWatcher
oFileWatcher.Path = sMonitorFolder
oFileWatcher.Filter = "*.CSV"
If blnMonitorUpdated Then
AddHandler oFileWatcher.Changed, AddressOf Me.FileSystemWatcherUpdated
Else
'RemoveHandler , AddressOf Me.FileSystemWatcherUpdated
End If
If blnMonitorCreated Then
AddHandler oFileWatcher.Created, AddressOf Me.FileSystemWatcherCreated
Else
'RemoveHandler , AddressOf Me.FileSystemWatcherCreated
End If
oFileWatcher.EnableRaisingEvents = True
aFileWatcherInstance.Add(oFileWatcher)
End If
Next
End Sub
Private Sub FileSystemWatcherCreated(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs)
strFullFileName = e.FullPath
strFileName = Mid(e.Name, 3, Len(e.Name))
strFolderName = strFileName.Split("_")(0)
If Me.InvokeRequired Then
Dim d As New updateLabel(AddressOf updateLabelHandler)
Me.BeginInvoke(d, New Object() {strFolderName})
Else
updateLabelHandler(strFolderName)
End If
ReadAndInsertCSVData()
End Sub
Private Sub FileSystemWatcherDeleted(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs)
'A file has been deleted from the child directory.
End Sub
Private Sub FileSystemWatcherUpdated(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs)
strFullFileName = e.FullPath
strFileName = Mid(e.Name, 3, Len(e.Name))
strFolderName = strFileName.Split("_")(0)
If Me.InvokeRequired Then
Dim d As New updateLabel(AddressOf updateLabelHandler)
Me.BeginInvoke(d, New Object() {strFolderName})
Else
updateLabelHandler(strFolderName)
End If
ReadAndInsertCSVData()
End Sub
末級
任何幫助,將不勝感激。
你添加一些try-catch塊和記錄任何錯誤到事件日誌?沒有任何線索很難排除程序崩潰。 – terryfkjc
我試過了,在使用複製粘貼更新幾個文件夾時無法檢測到任何錯誤。它可能是由SQL服務器例程引起的,還是由於在複製過程中使用該文件而導致第三方同步工具引起的,並且在從服務器完成複製活動之前可能仍在使用中。 – chlorinelemon
在你的應用程序中,一定要訂閱** AppDomain.CurrentDomain.UnhandledException **事件,當它發生時,記錄異常。然後添加你發現這個問題的異常。 – miroxlav