Почему я получаю исключение для файла с помощью метода Interaction.Shell?

1

Я хочу открыть файл блокнота с помощью метода VisualBasic.Interaction.Shell. В настоящее время я получаю исключение, не найденное в файле, используя следующий код.

int pid = Interaction.Shell(@"D:\abc.txt", AppWinStyle.NormalNoFocus, false, -1);

Но это работает:

int pid = Interaction.Shell(@"notepad.exe", AppWinStyle.NormalNoFocus, false, -1);

Что только открывает файл блокнота. Почему это?

Мне нужно открыть файл в определенном месте. Я вижу некоторое преимущество при выполнении Interaction.Shell. Как можно открыть файл в определенном месте с помощью Interaction.Shell?

  • 0
    Shell () - это то же самое, что Process.Start () с ProcessStartInfo.UseShellExecute = false. Это означает, что вы можете запускать только исполняемые программы, а не документы. Используйте класс Process.
  • 0
    @HansPassant Я пытался охватить ту же проблему с Блокнотом, который фокусировался при запуске, как process.Start (). VB так хорошо с этим справляется. Получил это здесь stackoverflow.com/questions/2121911/…. Также решение ответчиком здесь занимается этим. Спасибо
Теги:
shellexecute
interaction

1 ответ

4
Лучший ответ

Похоже, что Interaction.Shell не может открыть приложение связанным документом. (а) соответствующая страница MSDN не говорит об этом (хотя пример для параметра PathName кажется ошибочным тогда) и (б), даже если D:\abc.txt существует, он терпит неудачу.

В качестве альтернативы вы можете использовать класс System.Diagnostics.Process:

using (Process process = Process.Start(@"D:\abc.txt"))
{
    int pid = process.Id;

    // Whether you want for it to exit, depends on your needs. Your
    // Interaction.Shell() call above suggests you don't.  But then
    // you need to be aware that "pid" might not be valid when you
    // you look at it, because the process may already be gone.
    // A problem that would also arise with Interaction.Shell.
    // process.WaitForExit();
}

Обратите внимание, что D:\abc.txt должен существовать, или вы все равно получаете FileNotFoundException.

Обновить Если вам действительно нужно использовать Interaction.Shell, вы можете использовать следующие

int pid = Interaction.Shell(@"notepad.exe D:\abc.txt", false, -1);

Лично я бы пошел с классом Process, так как он обычно обеспечивает более эффективную обработку запущенного процесса. В этом случае он также освобождает вас от "знания", какая программа связана с файлами .txt (если вы не всегда хотите использовать notepad.exe).

  • 0
    Идеальное решение. У меня проблема с блокнотом, который фокусируется при его открытии, как process.Start () из моего приложения winforms. Который вы можете поймать здесь stackoverflow.com/questions/8881038/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню