2017-01-31 4 views
0

Wir haben einen Windows-Dienst, der die Dateien verschiebt (7 Dateien, 5 * event.xdf, 1 statistics.xdf und 1 order.xdf Dateien) und übersetze es in xml.VB.NET - So kopieren Sie die Datei zuerst, bevor sie von den anderen Diensten verschoben wird

Ich habe einen Windows-Dienst erstellt, der alle 7 Dateien kopiert, bevor sie von den anderen Windows-Diensten verschoben werden. Ich kann nur 3 * event.xdf, 1 statistics.xdf und 1 order.xdf kopieren.

Ich vermisse 2 event.xdf.

Hier ist meine Logik für Code

ich einen Thread für jede einzelne Datei zu erstellen und jede Kopie.

Kopieren Ereignis Tempfaltblatt:

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() 

Funktionen:

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

Ist das nicht genau das, was [Filesystemwatcher] (https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher%28v=vs.110%29.aspx) ist für ? – MrGadget

Antwort

0

Alternative Ansatz FileSystemWatcher und Aufgaben mit Hilfe der Datei zu kopieren, sobald es verfügbar ist.

Watcher.EnableRaisingEvents = True würde in Ihrem Service OnStart gehen.

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

Vielen Dank Herr! Ich habe gerade den AddHandler Watcher hinzugefügt. Acreded, AddressOf Watcher_created. Auch der Select-Fall funktioniert nicht. Es gibt auch Zeiten, in denen die Dateien fertig sind und ich mal noch 1 oder 2 Dateien vermisse. – jebeeee

+0

Ja, das müssen Sie tun, wenn Sie es nicht mit 'WithEvents' instanziieren und die Handler automatisch generieren. – MrGadget

+0

Vergessen Sie nicht, die Antwort zu markieren, indem Sie auf das Häkchen auf der linken Seite klicken. – MrGadget

Verwandte Themen