Открыть текстовый файл из приложения С#

Следующий код должен открывать CMD из моего приложения C# и открывать файл text.txt.

Я попытался установить путь к файлу как переменную среды, но когда блокнот открывается, он ищет %file%.txt вместо text.txt

Есть идеи, почему?

System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.EnableRaisingEvents=false;
        proc.StartInfo.EnvironmentVariables.Add("file", "c:\\text.txt");
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.FileName = "notepad";

        proc.StartInfo.Arguments="%file%";
        proc.Start();
        proc.WaitForExit();

        Console.WriteLine(proc.ExitCode);

person Community    schedule 07.01.2009    source источник


Ответы (8)


Если ваша цель - запустить редактор с файлом .txt (как говорится в заголовке вопроса), просто используйте:

Process.Start("C:\\text.txt")
person GvS    schedule 07.01.2009

Короткая версия заключается в том, что я подозреваю, что вам придется передавать аргумент более напрямую, т.е.

 proc.StartInfo.Arguments = @"""c:\text.txt""";

Хотя вы можете установить переменные среды (для использования внутри процесса), я не думаю, что вы можете использовать их во время запуска процесса.

person Marc Gravell    schedule 07.01.2009

Чего вы пытаетесь достичь с помощью %file%? Аргумент командной строки для notepad.exe — это файл, который вы хотите открыть. Вам нужно сделать что-то вроде этого:

proc.StartInfo.Arguments = "c:\\text.txt";
person BFree    schedule 07.01.2009

установить UseShellExecute = true

таким образом, он должен использовать процессор cmd.exe для расширения переменной %file%

person bwknight877    schedule 07.01.2009
comment
InvalidOperationException: объект Process должен иметь для свойства UseShellExecute значение false, чтобы можно было использовать переменные среды. - person Marc Gravell; 07.01.2009

Одна очевидная проблема заключается в том, что у вас UseShellExecute установлено значение false. Это означает, что вы запускаете блокнот напрямую, минуя командную оболочку cmd.exe. Поэтому переменные среды не расширяются.

Я не уверен, чего вы пытаетесь достичь (зачем вам нужно добавить переменную среды?), но сработает следующее:

    System.Diagnostics.Process proc = 
        new System.Diagnostics.Process(); 
    proc.EnableRaisingEvents = false; 
    proc.StartInfo.EnvironmentVariables.Add("file", "c:\\text.txt"); 
    proc.StartInfo.UseShellExecute = false; 
    proc.StartInfo.FileName = "cmd.exe";
    proc.StartInfo.Arguments = "/c notepad %file%"; 
    proc.Start(); 
    proc.WaitForExit(); 
person Joe    schedule 07.01.2009

Попробуй это:

proc.StartInfo.Arguments = System.Environment.GetEnvironmentVariable("file");
person brien    schedule 07.01.2009
comment
Получает переменную окружения из текущего процесса; OP хотел определить переменную для процесса new и использовать ее там. - person Marc Gravell; 07.01.2009

Возможно, это связано с тем, как работает StartInfo.Arguments. Если вы не можете найти ничего лучше, это сработало для меня:

proc.StartInfo.FileName = "cmd";
proc.StartInfo.Arguments="/c notepad %my_file%";
person kgiannakakis    schedule 07.01.2009

Я готов поспорить, что вам нужно установить WorkingDirectory, чтобы заставить это работать. NOTEPAD.exe обычно находится в %SYSTEMROOT% (C:\windows), однако по умолчанию это %SYSTEMROOT%\system32. Попробуйте ниже.

System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.EnableRaisingEvents=false;
        proc.StartInfo.WorkingDirectory = "%SYSTEMROOT%";
        proc.StartInfo.EnvironmentVariables.Add("file", "c:\\text.txt");
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.FileName = "notepad";

        proc.StartInfo.Arguments="%file%";
        proc.Start();
        proc.WaitForExit();

        Console.WriteLine(proc.ExitCode);
person Nick Berardi    schedule 07.01.2009