none
Перенаправление потоков ввода-вывода средствами Windows RRS feed

  • Вопрос

  • Код на С:
    #include <stdio.h>
    #include <locale.h>
    int main(){
        int c;
        setlocale(LC_ALL,"");
        c = getchar();
        while(c != EOF){
            putchar(c);
            c = getchar();
        }    
        return 0;
    }
    


    Откомпилированный файл запускаю в командной строке Windows, указав в параметрах следующее:
    Параметры командной строки
    Цитата

    <"D:\MS VS 2010 Projects\Учебные\Керниган\InputOutputFiles\input.txt" >"D:\MS VS 2010 Projects\Учебные\Керниган\InputOutputFiles\output.txt" 2> "D:\MS VS 2010 Projects\Учебные\Керниган\InputOutputFiles\error.txt"


    В результате, в файл output.txt записывается содержимое файла input.txt, т.е. работает как нужно.

    Решил попробовать подобный подход на C#:
    код C#
    using System;
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main() {
                int key = Console.Read();
                while (key != -1) {
                    Console.Write((char)key);
                    key = Console.Read();
                }
            }
        }
    }
    
    


    В параметры командной строки передаю то же, что передавал в предыдущем примере (прописал в настройках проекта, на вкладке "Отладка").

    А теперь собственно вопрос:

    Если запустить .net-код в режиме отладки, то в файл output.txt ничего не записывается, а после того, как код отрабатывает и консольное окно закрывается, файлы input.txt, output.txt и error.txt недоступны для изменения/удаления - получаю сообщение, что они заняты процессом, хотя консольное приложение уже отработало и закрылось. Т.о. студия держит файлы в подвешенном состоянии... 
    Если закрыть MS VS 2010 - файлы становятся доступными. Почему так происходит?

    P.S. Если запустить откомпилированный файл из командной строки (cmd.exe) Windows, с указанием параметров, приведённых выше, а не из отладчика MS VS 2010, то в файл output.txt информация записывается. 
    28 ноября 2010 г. 14:26

Ответы

  • Перенаправлением занимается cmd.exe. А параметры, вписанные в "command lines arguments" передаются или сразу твоему приложению, или visual studio hosting process, если он включен.

    В первом случае твое приложение получит имена файлов и <> как параметры метода Main - и ничего на диск не запишет. Во втором - будет перенаправлен ввод-вывод для vs hosting process. Hosting Process ничего не читает, не пишет, и висит в памяти пока не перезагрузишь студию или хотя бы проект.

    Впиши в параметрах отладки:

    Start External Program: c:\windows\System32\cmd.exe

    Command Line Parameters: /C ConsoleApplication28.exe < D:\temp\jjjj\input.txt > D:\temp\jjjj\output.txt 2> D:\temp\jjjj\error.txt

    • Помечено в качестве ответа Abolmasov Dmitry 29 ноября 2010 г. 23:06
    29 ноября 2010 г. 10:03
    Модератор

Все ответы

  • Перенаправлением занимается cmd.exe. А параметры, вписанные в "command lines arguments" передаются или сразу твоему приложению, или visual studio hosting process, если он включен.

    В первом случае твое приложение получит имена файлов и <> как параметры метода Main - и ничего на диск не запишет. Во втором - будет перенаправлен ввод-вывод для vs hosting process. Hosting Process ничего не читает, не пишет, и висит в памяти пока не перезагрузишь студию или хотя бы проект.

    Впиши в параметрах отладки:

    Start External Program: c:\windows\System32\cmd.exe

    Command Line Parameters: /C ConsoleApplication28.exe < D:\temp\jjjj\input.txt > D:\temp\jjjj\output.txt 2> D:\temp\jjjj\error.txt

    • Помечено в качестве ответа Abolmasov Dmitry 29 ноября 2010 г. 23:06
    29 ноября 2010 г. 10:03
    Модератор
  • Спасибо!
    30 ноября 2010 г. 11:44