2013-06-18 4 views
1

Je démarre un nouveau processus dans un service .net et exécute winrar dans la console. Cela fonctionne très bien pour les dossiers qui n'ont pas une grande quantité de fichiers et de fichiers individuels, mais lors de l'archivage de gros dossiers, le processus semble s'arrêter à un moment donné. Je dis qu'il semble arrêter parce queLe processus se termine de manière inattendue

  1. L'archive est pas terminée quand je reçois la sortie arrière
  2. Le processus principal déclenchement de la raring du dossier commence à nouveau

Voici la pièce de code qui exécute le processus:

Private Sub log(text As String) 
    IO.File.AppendAllText("log.txt", text) 
End Sub 

Private Sub SortOutputHandler(sendingProcess As Object, _ 
    outLine As DataReceivedEventArgs) 
    If Not String.IsNullOrEmpty(outLine.Data) Then 
     numOutputLines += 1 
     log(Environment.NewLine & "[" _ 
        & numOutputLines.ToString() & "] - " _ 
        & outLine.Data) 
    End If 
End Sub 

Private Function RunCmd(ParamArray commands As String()) As String 
    Try 
     If Not sortOutput Is Nothing Then 
      sortOutput.Length = 0 
     End If 

     Dim returnvalue As String = String.Empty 

     Dim info As New ProcessStartInfo("cmd") 
     info.UseShellExecute = False 
     info.RedirectStandardInput = True 
     info.RedirectStandardOutput = True 
     info.CreateNoWindow = True 

     Using process__1 As Process = Process.Start(info) 
      AddHandler process__1.OutputDataReceived, AddressOf SortOutputHandler 
      process__1.BeginOutputReadLine() 

      Using sw As StreamWriter = process__1.StandardInput 
       For Each command As String In commands 
        sw.WriteLine("chcp 65001") 
        sw.WriteLine(command) 
        log(command) 
       Next 
       sw.Close() 
      End Using 
      process__1.WaitForExit() 
     End Using 

     returnvalue = sortOutput.ToString 

     info = Nothing 
     Return returnvalue 
    Catch ex As Exception 
     Return Nothing 
    End Try 

End Function 

Private Sub zip(destinationFolder As String, outputFile As String, sourceItem As String) 
    Dim results As String = RunCmd("rar.exe u """ & destinationFolder & outputFile & """ -m3 -w" & workingDir & " """ & sourceItem & """ ") 

End Sub 

ce que je reçois en tant que sortie est ce que l'on pouvait s'y attendre lors de l'exécution rar de la ligne de commande, mais il juste extrémités au cours de l'archivage:

[3945] - Adding \\servername\path1  51% OK 
[3946] - Adding \\servername\path2  51% 
[3947] - C:\Windows\system32> 

L'archive est incomplète et System.IO. exception est levée dans le bloc principal du service se plaindre il ne peut pas trouver une partie d'un chemin (un des dossiers enfants de la source passée à la ligne de commande)

Je me demande si la lecture asynchrone de la sortie est correct? Il me semble que c'est la sortie ligne par ligne dans le fichier journal, mais j'ai eu le même problème (bien que je ne pouvais pas avoir les mêmes journaux) quand je lisais la sortie de manière synchrone.

Merci

Répondre

0

Le problème est dans cette partie du code:

Catch ex As Exception 
    Return Nothing 
End Try 

Toute exception qui peut se produire est simplement ignoré, et la fonction retourne immédiatement. Vous pouvez au moins renvoyer un message d'exception au lieu de Nothing, ce qui, espérons-le, vous donnera un indice sur ce qui s'est passé et sur la façon de résoudre la situation.

+0

Ceci est une version légèrement réduite du code, il y a un appel supplémentaire dans cette capture pour enregistrer l'exception. Il n'y a pas d'exception dans cette partie du code essentiellement, la seule exception que je reçois est dans le bloc principal de mon service qui appelle le zip Sub. Puisque la seule raison pour laquelle la partie principale du service est répétée est parce que le RAR ne se termine pas en premier lieu, je pense que cela n'a probablement rien à voir avec ça. – iasonas

Questions connexes