Я побачив іншу тему і у мене виникає інша проблема. Процес запускається (бачив у диспетчері завдань), але папка не відкривається на моєму екрані. Що не так?
System.Diagnostics.Process.Start("explorer.exe", @"c:\teste");
Я побачив іншу тему і у мене виникає інша проблема. Процес запускається (бачив у диспетчері завдань), але папка не відкривається на моєму екрані. Що не так?
System.Diagnostics.Process.Start("explorer.exe", @"c:\teste");
Відповіді:
Ви переконалися, що папка " 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");
Якщо жодне з них (ну, крім тієї, яка кидає виняток) не працює на вашому комп’ютері, я не думаю, що проблема полягає в коді, а в оточенні. Якщо це так, я б спробував одне (або те і інше) з наступного:
Process.Start(path)
активує вікно (може моргати лише на панелі завдань, а не приводити до фронту); explorer.exe
Параметр + відкриває нове вікно завжди спереду (але кілька разів за одне вікно). Тож обоє мають застереження.
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\")
.
Просто для повноти, якщо все, що ви хочете зробити, це відкрити папку, скористайтеся цим:
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo() {
FileName = "C:\\teste\\",
UseShellExecute = true,
Verb = "open"
});
Переконайтеся, що FileName закінчується, Path.DirectorySeparatorChar
щоб однозначно вказати на папку. (Дякую @binki.)
Це рішення не працюватиме для відкриття папки та вибору елемента, оскільки не здається дієсловом для цього.
C:\teste.exe
чи C:\teste.cmd
існує, Explorer відкриється для цієї іншої папки замість тієї, яку ви задумали. Щоб цього уникнути, ви можете додати a Path.DirectorySeparatorChar
до шляху. Подивіться, як саме VS робить ту саму помилку .
Verb = "select"
, але, на жаль, не можете. Незалежно, чудова відповідь!
Verb = "open"
не потрібно. (Випробувано в Windows, інші ОС можуть відрізнятися.)
.Verbs
властивості на ProcessStartInfo
( docs.microsoft.com/en-us/dotnet/api/… )
Ви використовуєте символ @, який усуває необхідність уникнути зворотних нахилів.
Видаліть @ або замініть \\ на \
Вам не потрібен подвійний кут нахилу під час використання рядків без нагляду:
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
Вам слід скористатися одним із System.Diagnostics.Process.Start()
перевантажень. Це досить просто!
Якщо ви не розмістите ім'я файлу процесу, який потрібно запустити ( explorer.exe
), система розпізнає його як дійсний шлях до папки та спробує приєднати його до вже запущеного процесу Провідника. У цьому випадку, якщо папка вже відкрита, Explorer нічого не зробить.
Якщо ви розмістите ім'я файлу процесу (як ви це зробили), система спробує запустити новий екземпляр процесу, передаючи другий рядок як параметр. Якщо рядок є дійсною папкою, вона відкривається в новоствореному процесі, якщо ні, то новий процес нічого не зробить.
Я не знаю, як в будь-якому випадку процес трактуються недійсні контури папок. Використання System.IO.Directory.Exists()
повинно бути достатньо для забезпечення цього.
Path.DirectorySeparatorChar
. В іншому випадку, якщо папка з тим самим іменем, але .cmd
або, .exe
можливо, іншими суфіксами також існує, Explorer відкриється для цієї іншої папки, або якщо вони є справді виконуваними файлами або скриптами, він запустить їх замість того, щоб відкривати папку, як ви задумали.
Використовуйте перевантажену версію методу, який приймає екземпляр ProcessStartInfo і встановіть для властивості ProcessWindowStyle значення, яке працює для вас.
Ви уникаєте зворотної косої риси, коли знак при цьому робить це за вас.
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
Цей код відмінно працює в середовищі VS2010 і відкриває локальну папку належним чином, але якщо ви розмістите ту саму програму в IIS і спробуйте відкрити її, вона точно не вийде.
У мене щойно виникло це питання, і я дізнався чому. моя причина не вказана тут, тому будь-хто інший, хто отримує це питання, і жодне з них не виправляє це.
Якщо ви запускаєте Visual Studio як інший користувач і намагаєтеся використовувати Process.Start, він запускається в контексті цього користувача, і ви його не побачите на екрані.
Дивно.
Якщо він не може знайти explorer.exe, ви повинні отримати виняток. Якщо він не може знайти папку, він все одно відкриє деяку папку (наприклад, мої документи)
Ви кажете, що в диспетчері завдань з’являється ще одна копія Провідника, але ви не бачите її.
Чи можливо це відкриття екрана (тобто іншого монітора)?
Або ви випадково робите це в неінтерактивному сервісі?
Чи правильно відкривається, коли ви запустите "explor.exe c: \ teste" зі свого меню "Пуск"? Як давно ви це намагаєтесь? Я бачу подібну поведінку, коли на моїй машині є багато процесів і коли я відкриваю новий процес (набори говорять про IE) .. він починається в диспетчері завдань, але не відображається на передньому кінці. Ви спробували перезапуск?
Наступний код повинен відкрити новий екземпляр провідника
class sample{
static void Main()
{
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
}
}
У вас багато запущених програм, коли ви намагаєтеся це зробити? Іноді я стикаюся з дивною поведінкою на роботі, тому що в моїй системі не вистачає ручок GDI, оскільки у мене відкрито багато вікон (наші програми використовують багато).
Коли це відбувається, вікна та контекстні меню довго не з’являються, поки я не закрию щось, щоб звільнити деякі ручки GDI.
Ліміт за замовчуванням у XP та Vista - 10000. Не рідкість у мого DevStudio є 1500 ручок GDI, тому якщо у вас відкрито пару примірників студії Dev, вона може з'їсти їх досить швидко. Ви можете додати стовпчик у TaskManager, щоб побачити, скільки ручок використовується для кожного процесу.
Існує налаштування реєстру, яку ви можете зробити для збільшення ліміту.
Для отримання додаткової інформації див. Http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
Просто змініть шлях або оголосіть його в string