У меня есть требование контролировать корневую папку, в которой есть несколько папок и каждая папка, содержащая несколько файлов (.csv). Эти файлы копируются на рабочую станцию с сервера, используя некоторые другие сторонние инструменты. Я должен отслеживать папку корневой папки рабочей станции, и когда файл CSV создается или обновляется в любой из дочерних папок, мне приходится записывать данные CSV-файла (обновленные или новые) в базу данных sql-сервера. При записи данных на сервер sql мне нужно записать имя дочерней папки, в которой был обновлен/создан файл CSV. Таким образом, я могу иметь данные отдельной папки в одном файле базы данных.VB.Net FileSystemWatcher - несколько папок и несколько файлов
При запуске программы на ПК рабочей станции приложение аварийно завершает работу без какого-либо конкретного сообщения об ошибке. А поскольку приложение запускается на удаленном ПК, я не могу отлаживать приложение, чтобы проверить, какая строка вызывает сбой. Ниже приведен код:
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
End Class
Любая помощь будет оценена.
вы добавить примерки поймать блок и регистрировать любую ошибку в журнале событий? сложно устранить неисправность программы без каких-либо подсказок. – terryfkjc
Я пробовал это и не мог обнаружить никаких ошибок при обновлении нескольких папок с помощью скопирования. Может ли это быть вызвано подпрограммой сервера SQL или вызвано сторонним инструментом синхронизации, поскольку файл используется во время копирования и все еще может быть использован до завершения операции копирования с сервера. – chlorinelemon
В вашем приложении обязательно подпишитесь на ** AppDomain.CurrentDomain.UnhandledException **, а когда это произойдет, запишите исключение. Затем добавьте исключение, которое вы нашли в этом вопросе. – miroxlav