Откройте папку с помощью Process.Start


148

Я видел другую тему, и у меня другая проблема. Процесс запускается (видел в диспетчере задач), но папка не открывается на моем экране. В чем дело?

System.Diagnostics.Process.Start("explorer.exe", @"c:\teste");

ты уверен, что твой путь правильный?
Натан Куп

1
Почему вы хотите вызвать проводник вручную? Почему бы просто не открыть папку, то есть вызвать Process.Start с ProcessStartInfo, для которого для UseShellExecute установлено значение true, а для глагола установлено значение «open»?
OregonGhost

1
Да, я попытался открыть «explorer.exe» без пути и тоже не сработал.
Даниэль

Ну, я не писал, потому что вопрос не в том, как открыть папку, а в том, как запустить explorer.exe, чтобы открыть папку. Я просто хотел знать, почему вы хотите вызвать проводник напрямую, потому что может быть причина;)
OregonGhost

Я просто хочу исключить опции здесь, так что это может быть глупым вопросом: вы не делаете это в Linux, используя моно, верно? Мы говорим о среде Windows?
Фредрик Мёрк

Ответы:


266

Вы убедились, что папка " c:\teste" существует? Если этого не произойдет, откроется проводник, показывающий папку по умолчанию (в моем случае " C:\Users\[user name]\Documents").

Обновить

Я пробовал следующие варианты:

// opens the folder in explorer
Process.Start(@"c:\temp");
// opens the folder in explorer
Process.Start("explorer.exe", @"c:\temp");
// throws exception
Process.Start(@"c:\does_not_exist");
// opens explorer, showing some other folder)
Process.Start("explorer.exe", @"c:\does_not_exist");

Если ни один из них (кроме того, который выдает исключение) не работает на вашем компьютере, я не думаю, что проблема заключается в коде, но в среде. Если это так, я бы попробовал одно (или оба) из следующего:

  • Откройте диалоговое окно «Выполнить», введите «explorer.exe» и нажмите «Ввод».
  • Откройте командную строку, введите «explorer.exe» и нажмите Enter

Ну, я уверен, и если бы его не было, открыл бы любую папку таким же образом или нет?
Даниэль

Что ж, тогда это может быть проблема среды. Я открыл explorer.exe через cmd и открыл нормально .. Ни один из Processs.Start не работал, кроме 'Process.Start (@ "c: \ does_not_exist");' что бросило исключение
Даниил

1
Небольшая разница, если это окно обозревателя уже открыто: Process.Start(path) активирует окно (может мигать только на панели задач, не выводится на передний план); explorer.exe+ параметр открывает новое окно всегда впереди (но несколько раз одно и то же окно). Так что у обоих есть предостережения.
KekuSemau

Process.Start(@"c:\temp")должны использоваться с осторожностью. Если c:\temp.comсуществует, то c:\temp.comвместо этого откроется вызов функции . См. Forums.iis.net/p/1239773/2144186.aspx для более подробной информации.
Лекс Ли

Обратите внимание, что Process.Start(@"c:\temp")может открыться другая папка, например C:\temp.exeили C:\temp.cmd. Смотрите эту проблему, где сама VS демонстрирует ошибочное поведение . Вы можете избежать этого, используя explorer.exeвариант или (лучше IMO) всегда добавляя a Path.DirectorySeparatorChar. Например, Process.Start(@"C:\temp\").
Бинки

46

Просто для полноты, если все, что вы хотите сделать, это открыть папку, используйте это:

System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo() {
    FileName = "C:\\teste\\",
    UseShellExecute = true,
    Verb = "open"
});

Убедитесь, что FileName заканчивается, Path.DirectorySeparatorCharчтобы он однозначно указывал на папку. (Спасибо @binki.)

Это решение не будет работать для открытия папки и выбора элемента, так как для этого нет глагола.


Это работает для меня, как на Windows, так и на Linux, используя Mono.
Менно Дей - ван Рейсвейк

1
Если вы используете этот метод и папка, такая как C:\teste.exeили C:\teste.cmdсуществует, Explorer откроет другую папку вместо той, которую вы намеревались. Чтобы избежать этого, вы можете добавить Path.DirectorySeparatorCharк пути. Посмотрите, как сама VS делает ту же ошибку .
Бинки

Учитывая ответ @ Scyssion с помощью «/ select», вы можете подумать, что можете использовать Verb = "select", но, увы, не можете. Независимо, отличный ответ!
idbrii

1
Это работает для меня в .NET Core 3, в отличие от принятого выше ответа. Установка Verb = "open"не была необходима. (Протестировано в Windows, другие ОС могут отличаться.)
Уолт Д.

Вы можете получить соответствующие глаголы в .Verbsотеле по адресуProcessStartInfo ( docs.microsoft.com/en-us/dotnet/api/… )
GaryNg,

16

Если вы хотите выбрать файл или папку, вы можете использовать следующее:

Process.Start("explorer.exe", "/select, c:\\teste");

2
Чтобы открыть папку вместо ее выбора, просто измените /selectна/open
SushiGuy

5

Вы используете символ @, который устраняет необходимость экранирования от обратной косой черты.

Удалить @ или заменить \\ на \


Все еще не открываю папку .. Только запускаю процесс @ диспетчер задач
Даниэль

У меня больше нет предложений, я смог протестировать и заставить его работать в Visual C # express 2008
Кевин Лейти

1
Я бы сказал ... зебры. Что-то не так с вашим исследователем, может быть, virii или что-то ...
Р. Мартиньо Фернандес

4

Вам не нужен двойной обратный слеш при использовании неэкранированных строк:

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

3

Вы должны использовать одну из System.Diagnostics.Process.Start()перегрузок. Это довольно просто!

Если вы не укажете имя файла процесса, который хотите запустить ( explorer.exe), система распознает его как допустимый путь к папке и попытается присоединить его к уже запущенному процессу Explorer. В этом случае, если папка уже открыта, Explorer ничего не сделает.

Если вы поместите имя файла процесса (как вы это сделали), система попытается запустить новый экземпляр процесса, передав в качестве параметра вторую строку. Если строка является допустимой папкой, она открывается во вновь созданном процессе, если нет, новый процесс ничего не будет делать.

Я не знаю, как процесс обрабатывает неверные пути к папкам в любом случае. Использование System.IO.Directory.Exists()должно быть достаточно, чтобы обеспечить это.


Не забывайте, что вам нужно добавить Path.DirectorySeparatorChar. В противном случае, если папка с тем же именем, но .cmdили, .exeвозможно, и другими суффиксами, также существует, Explorer откроет эту другую папку - или, если это на самом деле исполняемые файлы или сценарии, он запустит их вместо того, чтобы открыть папку, как вы планировали.
binki

1

Используйте перегруженную версию метода, которая принимает экземпляр ProcessStartInfo, и установите для свойства ProcessWindowStyle значение, которое подходит вам.


1

Вы избегаете обратной косой черты, когда знак at делает это за вас.

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

1
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste"); 

Этот код отлично работает в среде VS2010 и правильно открывает локальную папку, но если вы разместите то же приложение в IIS и попытаетесь открыть, то оно наверняка не получится.


1

У меня только что была эта проблема, и я узнал почему. моя причина не указана здесь, так что кто-либо еще, кто получает эту проблему, и ни один из них не устраняет ее.

Если вы запустите Visual Studio от имени другого пользователя и попытаетесь использовать Process.Start, он будет работать в контексте этого пользователя, и вы не увидите его на своем экране.


0

Странный.

Если он не может найти explorer.exe, вы должны получить исключение. Если он не может найти папку, он все равно должен открыть какую-то папку (например, мои документы)

Вы говорите, что в диспетчере задач появляется другая копия Explorer, но вы ее не видите.

Возможно ли, что он открывается вне экрана (то есть другой монитор)?

Или вы случайно делаете это в неинтерактивном сервисе?


У меня есть только один монитор, и «вы говорите, что в диспетчере задач появляется еще одна копия Проводника, но вы ее не видите». это правильно ... Я не знаю, что вы имели в виду "Или вы случайно делаете это в неинтерактивном сервисе?"
Даниэль

Я имел в виду, если программа, которую вы пишете, является службой (которая по умолчанию работает полностью в фоновом режиме), а не обычной программой winforms. (Если вы не знаете, что такое сервис, вряд ли вы его пишете). Возвращаясь к диспетчеру задач, если вы выберете «переключиться на», «вывести на передний план» или «развернуть» в этом скрытом окне проводника, оно появится?
sgmoore

0

Правильно ли он открывается при запуске «explorer.exe c: \ teste» из меню «Пуск»? Как долго вы пытались это? Я вижу подобное поведение, когда на моей машине много процессов, и когда я открываю новый процесс (устанавливает, скажем, IE) ... он запускается в диспетчере задач, но не отображается во внешнем интерфейсе. Вы пробовали перезагрузку?

Следующий код должен открыть новый экземпляр проводника

class sample{

static void Main()
{
  System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
}
}

0

Много ли у вас приложений запущено, когда вы пытаетесь это сделать? Иногда я сталкиваюсь со странным поведением на работе, потому что в моей системе не хватает дескрипторов GDI, так как у меня так много открытых окон (наши приложения используют много).

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

Предельное значение по умолчанию в XP и Vista составляет 10000. Для моего DevStudio весьма обычно иметь 1500 дескрипторов GDI, поэтому, если у вас есть несколько открытых копий Dev Studio, они могут довольно быстро их съесть. Вы можете добавить столбец в TaskManager, чтобы увидеть, сколько дескрипторов используется каждым процессом.

Для увеличения лимита можно внести изменения в реестр.

Для получения дополнительной информации см. Http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.