Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Encoding и CMD


Автор: codegenz 17.9.2009, 08:15
Задача получить содержимое папки именно через командную строку. Все работает. Но при одном условии. В пути несодержится русских символов. Когда они появляются. Как на примере ниже, то в строке result пишется сообщение об ошибке.

Вопрос. Как заставить понимать русские символы при передачи их с C# в cmd ??
Код

string cmdline = "dir C:\\Documents and Settings\Admin\Мои документы\";
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();
cmd.StandardInput.WriteLine(cmdline);
cmd.StandardInput.Flush();
cmd.StandardInput.Close();

string result = cmd.StandardOutput.ReadToEnd();

Автор: Fortnox 17.9.2009, 08:45
Все потому, потому что тип string в .NET в юникоде, а командная строка Windows по-умолчанию использует кодовую страницу 866 (DOS 866), которая не понимает юникод.

Решения следующие (которые я встречал):
1) При запуске процесса cmd.exe изменить его кодовую страницу, путем указания аргумента: "/k chcp кодовая_страница"
2) Перекодировать строки, которые возвращаются от cmd.exe
3) Ну а я обычно использую такой "финт ушам":
Код

            System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("cmd.exe");
            psi.RedirectStandardInput = true;
            psi.RedirectStandardOutput = true;
            psi.StandardOutputEncoding = Encoding.GetEncoding(866);
            psi.UseShellExecute = false;
            psi.Arguments = "/c dir e:\\Документы\\";
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo = psi;
            proc.Start();
            System.IO.StreamReader sr = proc.StandardOutput;
            string result = sr.ReadToEnd();



Автор: codegenz 17.9.2009, 09:15
Приогромнейшее Вам спасибо. Это как раз то что я искал! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)