Отворете txt файл от C# приложение

Предполага се, че следният код отваря 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. Това означава, че изпълнявате notepad директно, без да преминавате през командната обвивка 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 искаше да дефинира променливата за новия процес и да го използва там. - 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