1

.net サービスで新しいプロセスを開始し、コンソールで winrar を実行しています。大量のファイルや個々のファイルを持たないフォルダーでは問題なく機能しますが、大きなフォルダーをアーカイブする場合、プロセスはある時点で停止するようです. 私はそれが停止しているようだと言っています

  1. 出力を戻すと、アーカイブは完全ではありません
  2. フォルダーの raring をトリガーするメイン プロセスが再び開始されます。

プロセスを実行するコードは次のとおりです。

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

出力として得られるのは、コマンド ラインから rar を実行したときに期待されるものですが、アーカイブの途中で終了するだけです。

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

アーカイブは不完全で、System.IO. サービスのメイン ブロックで例外が発生し、パスの一部 (コマンド ラインに渡されたソースの子フォルダーの 1 つ) が見つからないという不平を言っています。

出力の非同期読み取りが正しいかどうか疑問に思っていますか? ログファイルで1行ずつ出力を取得しているように思えますが、出力を同期的に読み取っていたときに同じ問題が発生しました(同じログはありませんでしたが)。

ありがとう

4

1 に答える 1