Відкрийте папку за допомогою Process.Start


148

Я побачив іншу тему і у мене виникає інша проблема. Процес запускається (бачив у диспетчері завдань), але папка не відкривається на моєму екрані. Що не так?

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

ти впевнений, що твій шлях правильний?
Натан Кооп

1
Чому ви хочете викликати Провідник вручну? Чому б просто не відкрити папку, тобто зателефонувати Process.Start з ProcessStartInfo з UseShellExecute встановити на true та Verb встановити на "відкрити"?
OregonGhost

1
Так, я спробував відкрити "explorer.exe" без шляху і не працював.
Даніель

Ну, я не публікував, оскільки питання не в тому, як відкрити папку, а в тому, як запустити explorer.exe, щоб відкрити папку. Мені просто хотілося дізнатися, чому ви хочете в першу чергу викликати провідника, тому що це може бути причина;)
OregonGhost

Я просто хочу виключити тут варіанти, тож це може бути дурним питанням: ви цього не робите в Linux, використовуючи моно, правда? Ми говоримо про середовище Windows?
Fredrik Mörk

Відповіді:


266

Ви переконалися, що папка " c:\teste" існує? Якщо цього не відбувається, відкриється програма Explorer, яка показує деяку папку за замовчуванням (у моєму випадку " 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" і натисніть клавішу Enter
  • Відкрийте командний рядок, введіть "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.
Menno Deij - van Rijswijk

1
Якщо ви використовуєте цей метод і папку, таку C:\teste.exeчи C:\teste.cmdіснує, Explorer відкриється для цієї іншої папки замість тієї, яку ви задумали. Щоб цього уникнути, ви можете додати a Path.DirectorySeparatorCharдо шляху. Подивіться, як саме VS робить ту саму помилку .
бінкі

Враховуючи відповідь @ Scyssion за допомогою "/ select", ви можете подумати, що можете використовувати Verb = "select", але, на жаль, не можете. Незалежно, чудова відповідь!
idbrii

1
Це працює для мене в .NET Core 3, на відміну від прийнятої відповіді. Встановлювати Verb = "open"не потрібно. (Випробувано в Windows, інші ОС можуть відрізнятися.)
Walt D

Ви можете отримати дієздатні дієслова з .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
Я б сказав ... зебри. У вашому досліднику щось не так, можливо, вирія чи щось таке ...
Р. Мартиньо Фернандес

4

Вам не потрібен подвійний кут нахилу під час використання рядків без нагляду:

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

3

Вам слід скористатися одним із System.Diagnostics.Process.Start() перевантажень. Це досить просто!

Якщо ви не розмістите ім'я файлу процесу, який потрібно запустити ( explorer.exe), система розпізнає його як дійсний шлях до папки та спробує приєднати його до вже запущеного процесу Провідника. У цьому випадку, якщо папка вже відкрита, Explorer нічого не зробить.

Якщо ви розмістите ім'я файлу процесу (як ви це зробили), система спробує запустити новий екземпляр процесу, передаючи другий рядок як параметр. Якщо рядок є дійсною папкою, вона відкривається в новоствореному процесі, якщо ні, то новий процес нічого не зробить.

Я не знаю, як в будь-якому випадку процес трактуються недійсні контури папок. Використання System.IO.Directory.Exists()повинно бути достатньо для забезпечення цього.


Не забувайте, що вам потрібно додати Path.DirectorySeparatorChar. В іншому випадку, якщо папка з тим самим іменем, але .cmdабо, .exeможливо, іншими суфіксами також існує, Explorer відкриється для цієї іншої папки, або якщо вони є справді виконуваними файлами або скриптами, він запустить їх замість того, щоб відкривати папку, як ви задумали.
бінкі

1

Використовуйте перевантажену версію методу, який приймає екземпляр ProcessStartInfo і встановіть для властивості ProcessWindowStyle значення, яке працює для вас.


1

Ви уникаєте зворотної косої риси, коли знак при цьому робить це за вас.

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, ви повинні отримати виняток. Якщо він не може знайти папку, він все одно відкриє деяку папку (наприклад, мої документи)

Ви кажете, що в диспетчері завдань з’являється ще одна копія Провідника, але ви не бачите її.

Чи можливо це відкриття екрана (тобто іншого монітора)?

Або ви випадково робите це в неінтерактивному сервісі?


У мене є лише 1 монітор, і "Ви говорите, що ще одна копія Провідника з'являється в менеджері завдань, але ви не можете його бачити". це правильно .. Я не знаю, що ви мали на увазі "Або ви випадково робите це в неінтерактивному сервісі?"
Даніель

Я мав на увазі, якщо програма, яку ви пишете, - це послуга (яка за замовчуванням працює повністю у фоновому режимі) на відміну від звичайної програми winforms. (Якщо ви не знаєте, що таке послуга, навряд чи ви пишете її). Якщо ви повернетесь до менеджера завдань, якщо у цьому прихованому вікні провідника ви виберете або "переключитися на", "перевести на фронт", або "максимально".
sgmoore

0

Чи правильно відкривається, коли ви запустите "explor.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, вона може з'їсти їх досить швидко. Ви можете додати стовпчик у TaskManager, щоб побачити, скільки ручок використовується для кожного процесу.

Існує налаштування реєстру, яку ви можете зробити для збільшення ліміту.

Для отримання додаткової інформації див. Http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx


0

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

Просто змініть шлях або оголосіть його в string

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.