2015-08-08 177 views
0

我有一個監控根文件夾下有多個文件夾和每個文件夾包含多個文件(.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 

末級

任何幫助,將不勝感激。

+1

你添加一些try-catch塊和記錄任何錯誤到事件日誌?沒有任何線索很難排除程序崩潰。 – terryfkjc

+0

我試過了,在使用複製粘貼更新幾個文件夾時無法檢測到任何錯誤。它可能是由SQL服務器例程引起的,還是由於在複製過程中使用該文件而導致第三方同步工具引起的,並且在從服務器完成複製活動之前可能仍在使用中。 – chlorinelemon

+0

在你的應用程序中,一定要訂閱** AppDomain.CurrentDomain.UnhandledException **事件,當它發生時,記錄異常。然後添加你發現這個問題的異常。 – miroxlav

回答