在手柄1的重定向期间,手柄无法打开

时间:2015-09-24 09:41:46

标签: .net command-line cmd io io-redirection

我在退出应用程序之前使用此代码保存应用程序数据库的备份(我也在主窗体的已关闭事件上手动调用此函数):

Private Sub Exit_Application() Handles btnExitApplication.Click, tsmiMainExit.Click
    Me.dump.Export(options.auto_backup_path + "\ON_EXIT " + Date.Now.ToString("yyyy-MM-dd HH-mm.bak"))
    Application.Exit()
End Sub

这是我的转储类中定义的Export()函数:

Public Class MysqlDump

    Public mysql_path As String
    Public db_name As String

    Private proc As New Process

    Sub New(ByVal mysql_dir As String, ByVal dbname As String)
        Me.mysql_path = mysql_dir
        proc.StartInfo.FileName = Environment.SystemDirectory + "\cmd.exe"
        proc.StartInfo.WorkingDirectory = Me.mysql_path + "\bin"
        proc.StartInfo.UseShellExecute = False
        proc.StartInfo.RedirectStandardError = True
        proc.StartInfo.CreateNoWindow = True
        Me.db_name = dbname
    End Sub

    Public Function Export(ByVal file_name As String) As Boolean
        proc.StartInfo.Arguments = String.Format("/c mysqldump {0} | gzip > ""{1}""", db_name, file_name)
        proc.Start()
        Dim sdd As String = proc.StandardError.ReadToEnd()
        proc.WaitForExit()
        If proc.ExitCode <> 0 Then
            Throw New Exception("Failed status:" + proc.ExitCode.ToString() + vbNewLine + "Error Info:" + sdd)
            Return False
        End If
        Return True
    End Function

End Class

当从visual studio运行/调试项目时(使用debug / x86 configs),上面的所有代码都正常运行但是当我尝试从它自己的目录运行已编译的应用程序可执行文件时,每次关闭应用程序时都会抛出此异常,在退出之前无法保存我的数据库备份:

  

System.Exception:失败状态:255

     

错误信息:在重定向句柄1期间无法打开句柄。

更新

如果我设置proc.StartInfo.RedirectStandardError = FALSE并注释= proc.StandardError.ReadToEnd(),则错误消失,但我希望能够重定向命令行错误并在我的应用程序中将其显示为异常消息。

1 个答案:

答案 0 :(得分:0)

在网上搜索了一些标准错误重定向的好例子后,我找到了一个工作示例,并将其与我的代码进行了比较,因此我发现我不应该只设置proc.StartInfo.RedirectStandardError = True选项而是我应该设置proc.StartInfo.RedirectStandardOutput = True以及,在添加此行代码之后,我就能够将错误重定向到我的应用程序并将其显示为新的异常。

但是我不知道为什么我应该这样做?!