2017-01-31 1 views
0

У нас есть существующая служба Windows, которая перемещает файлы (7 файлов, 5 * event.xdf, 1 statistics.xdf и 1 файл order.xdf) и перевести его в xml.VB.NET - Как скопировать файл перед его переносом другими службами

Я создал службу Windows, которая копирует все 7 файлов, прежде чем переместить их другими службами Windows. Я могу копировать только 3 * event.xdf, 1 statistics.xdf и 1 order.xdf.

Пропустить 2 event.xdf.

Вот моя логика для кода

создать поток для каждого отдельного файла и скопировать каждый.

Копировать событие в папку Temp:

thXDFevent = New System.Threading.Thread(AddressOf backup_xdf_events) 
thXDFevent.IsBackground = True 
thXDFevent.Start() 

'order 
thXDForder = New System.Threading.Thread(AddressOf backup_xdf_order) 
thXDForder.IsBackground = True 
thXDForder.Start() 

'statistics 
thXDFstatistics = New System.Threading.Thread(AddressOf backup_xdf_statistics) 
thXDFstatistics.IsBackground = True 
thXDFstatistics.Start() 

Функции:

Private Sub backup_xdf_events() 
     Try 
      While (True) 
       getXDFevents() 
      End While 
     Catch ex As Exception 
      'EventLog1.WriteEntry("Services XDF error:" & strDate.ToString) 
     End Try 
End Sub 

Private Sub getXDFevents() 
    Dim f As String 
    For Each f In Directory.GetFiles("C:\POS\", "*event.xdf") 

     My.Computer.FileSystem.CopyFile("C:\POS\" & Path.GetFileName(f), xdf_temp & Path.GetFileName(f), True) 
    Next f 
    System.Threading.Thread.Sleep(500) 
End Sub 

Private Sub backup_xdf_order() 
    Try 
     While (True) 
      getXDForder() 
     End While 
    Catch ex As Exception 
     'EventLog1.WriteEntry("Services XDF error:" & strDate.ToString) 
    End Try 
End Sub 
Private Sub getXDForder() 
    Dim f As String 
    For Each f In Directory.GetFiles("C:\POS\", "*order.xdf") 

     My.Computer.FileSystem.CopyFile("C:\POS\" & Path.GetFileName(f), xdf_temp & Path.GetFileName(f), True) 
    Next f 
    System.Threading.Thread.Sleep(500) 
End Sub 

Private Sub backup_xdf_statistics() 
    Try 
     While (True) 
      getXDFstatistics() 
     End While 
    Catch ex As Exception 
     'EventLog1.WriteEntry("Services XDF error:" & strDate.ToString) 
    End Try 
End Sub 


Private Sub getXDFstatistics() 
    Dim f As String 
    For Each f In Directory.GetFiles("C:\POS\", "*statistics.xdf") 

     My.Computer.FileSystem.CopyFile("C:\POS\" & Path.GetFileName(f), xdf_temp & Path.GetFileName(f), True) 
    Next f 
    System.Threading.Thread.Sleep(500) 
End Sub 
+0

Не является ли это именно то, что [FileSystemWatcher] (https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher%28v=vs.110%29.aspx) для ? – MrGadget

ответ

0

Альтернативный подход с использованием FileSystemWatcher и задачи, чтобы скопировать файл, как только она доступна.

Watcher.EnableRaisingEvents = True поступит в ваш сервис OnStart.

Module Module1 

    Private WithEvents Watcher As New IO.FileSystemWatcher("C:\POS", "*.xdf") 

    Private Const xdf_temp As String = "c:\pos\temp" 

    Sub Main() 
     Watcher.EnableRaisingEvents = True 

     Console.WriteLine("Watching . . .") 
     Console.ReadKey() 
    End Sub 

    Private Sub Watcher_Created(sender As Object, e As IO.FileSystemEventArgs) Handles Watcher.Created 
     Select Case True 
      Case e.FullPath.EndsWith("event.xdf") 
       Task.Run(Sub() CopyFile(e.FullPath)) 
      Case e.FullPath.EndsWith("statistics.xdf") 
       Task.Run(Sub() CopyFile(e.FullPath)) 
      Case e.FullPath.EndsWith("order.xdf") 
       Task.Run(Sub() CopyFile(e.FullPath)) 
     End Select 
    End Sub 

    Private Sub CopyFile(FullPath As String) 
     Dim Timeout As New Stopwatch 
     Dim Success As Boolean = False 

     Timeout.Restart() 

     Do Until Success Or Timeout.Elapsed.Minutes > 0 
      Try 
       IO.File.Copy(FullPath, IO.Path.Combine(xdf_temp, IO.Path.GetFileName(FullPath)), True) 
       Success = True 
      Catch 
       ' File Not accessible...locked, write in progress, etc. 
       Threading.Thread.Sleep(New TimeSpan(0, 0, 1)) 
      End Try 
     Loop 

     If Not Success Then 
      'Timeout expired - write something in an event log 
     End If 
    End Sub 

End Module 
+0

Большое спасибо, сэр! Я просто добавил AddHandler Watcher.Created, AddressOf Watcher_created. также случай выбора не работает. Кроме того, времена, когда файлы завершены, и времена, когда я все еще пропускаю 1 или 2 файла. – jebeeee

+0

Да, вы должны это сделать, если вы не создаете экземпляр, используя 'WithEvents' и автоматически генерируемые обработчики. – MrGadget

+0

Не забудьте отметить ответ, нажав галочку влево. – MrGadget

Смежные вопросы