Юникод символы в процессах и winrar

Я использую приведенный ниже код, чтобы запустить новый процесс и архивировать файлы с помощью winrar:

Private Function RunCmd(ParamArray commands As String()) As String
    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)
        Using sw As StreamWriter = process__1.StandardInput
            Using sr As StreamReader = process__1.StandardOutput
                For Each command As String In commands
                    sw.WriteLine(command)
                    IO.File.AppendAllText(workingDir & "\log.txt", command & vbCrLf)
                Next
                sw.Close()
                returnvalue = sr.ReadToEnd()
                sr.Close()
            End Using
        End Using
    End Using

    info = Nothing


    Return returnvalue
End Function

Этот код не может архивировать файлы, в именах которых есть символы Юникода. Я получаю ответ: ПРЕДУПРЕЖДЕНИЕ: нет файлов

Если я запускаю ту же команду в командной строке вручную, все работает нормально. Строка, которая выводит команду в файл, выводит команду правильно (с наличием символа Юникода). Примером команды, переданной этой функции, является следующее:

rar.exe u "\\mypath\myRarFile.rar" -m5 -wE:\WorkingDir "\\pathToFile\miljö.txt" 

Спасибо, Джейсон


person iasonas    schedule 14.01.2013    source источник
comment
Евгений Рошаль — хороший программист, но Юникод никогда не был его сильной стороной. Используйте библиотеку или перейдите на 7-zip.   -  person Hans Passant    schedule 14.01.2013


Ответы (1)


Это исправило мою проблему:

Private Function RunCmd(ParamArray commands As String()) As String
    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)
        Using sw As StreamWriter = process__1.StandardInput
            Using sr As StreamReader = process__1.StandardOutput
                For Each command As String In commands

                    sw.WriteLine("chcp 65001")

                    sw.WriteLine(command)
                Next
                sw.Close()
                returnvalue = sr.ReadToEnd()
                sr.Close()
            End Using
        End Using
    End Using
    info = Nothing

    Return returnvalue
End Function
person iasonas    schedule 15.01.2013